Skip to main content
Glama
FortiManager MCP Server

FortiManager MCP Server

by rstierli

FortiManager MCP Server

CI Python Version License: MIT Version FortiManager

A Model Context Protocol (MCP) server for FortiManager JSON-RPC API. This server enables AI assistants like Claude to interact with FortiManager for centralized firewall policy management, device provisioning, and network configuration.

Note: This is an independent open-source project and is not affiliated with, endorsed by, or supported by Fortinet, Inc. FortiManager is a trademark of Fortinet, Inc.

Disclaimer: This MCP server can create, modify, and delete configurations on FortiManager. Misuse or misconfiguration can impact production networks. Use at your own risk. Always test in a non-production environment first and ensure appropriate ADOM permissions are configured.

Overview

This MCP server provides a comprehensive interface to FortiManager's capabilities, allowing AI assistants to:

  • Create and manage firewall policies and policy packages, including security-profile (UTM) inspection

  • Configure firewall objects (addresses, services, VIPs)

  • Add, provision, and manage FortiGate devices

  • Configure device-DB interfaces, DHCP scopes, and wireless (VAPs, FortiAP/WTP profiles, managed APs)

  • Execute CLI scripts on managed devices

  • Configure provisioning and SD-WAN templates

  • Monitor tasks and installations

  • Manage ADOMs and workspace locking

Related MCP server: FortiGate MCP Server

Features

Category

Capabilities

Policy Management

Create/update/delete firewall policies, manage policy packages, clone packages, security-profile (UTM) inspection fields

Object Management

Addresses, address groups, services, service groups, search objects

Device Management

Add/delete devices, bulk operations, device status, VDOM management

Device Configuration

Interfaces/VLAN subinterfaces, DHCP scopes, wireless VAPs/SSIDs, FortiAP (WTP) profiles and managed AP registration -- all via the device DB, credential fields stripped from every read

Script Execution

Create/run CLI scripts, execute on devices/groups, view execution logs

Templates

System templates, CLI template groups, template assignment and validation

SD-WAN

SD-WAN templates, rule configuration, template assignment

System

System status, ADOM management, task monitoring, workspace locking

Requirements

  • Python: 3.12 or higher

  • FortiManager: 7.x with JSON-RPC API access enabled

  • Authentication: API token (recommended) or username/password

  • Network: HTTPS access to FortiManager management interface

Installation

# Clone the repository
git clone https://github.com/rstierli/fortimanager-mcp.git
cd fortimanager-mcp

# Create and activate virtual environment
uv venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate

# Install dependencies
uv sync

Using pip

# Clone the repository
git clone https://github.com/rstierli/fortimanager-mcp.git
cd fortimanager-mcp

# Create virtual environment
python -m venv .venv
source .venv/bin/activate

# Install package
pip install -e .

Using Docker

Pre-built images are available on GitHub Container Registry:

docker pull ghcr.io/rstierli/fortimanager-mcp:latest

Quick start with Docker Compose:

# docker-compose.yml
services:
  fortimanager-mcp:
    image: ghcr.io/rstierli/fortimanager-mcp:latest
    container_name: fortimanager-mcp
    restart: unless-stopped
    ports:
      - "8000:8000"
    env_file:
      - .env
    environment:
      - MCP_SERVER_MODE=http
      - MCP_SERVER_HOST=0.0.0.0
      - MCP_SERVER_PORT=8000
      - FORTIMANAGER_HOST=your-fmg-hostname
      # Keep TLS verification on; import the FortiManager CA for self-signed
      # certs. FORTIMANAGER_VERIFY_SSL=false disables MITM protection.
      - FORTIMANAGER_VERIFY_SSL=true
      - DEFAULT_ADOM=root
      - FMG_TOOL_MODE=full
      - LOG_LEVEL=INFO

Create a .env file for secrets (not tracked in git):

# .env
FORTIMANAGER_API_TOKEN=your-api-token
MCP_AUTH_TOKEN=your-secret-bearer-token  # optional, enables HTTP auth
chmod 600 .env
docker compose up -d

Verify the server is running:

curl http://localhost:8000/health
# {"status": "healthy", "service": "fortimanager-mcp", "fortimanager_connected": true}

Configuration

Environment Variables

Create a .env file from the example:

cp .env.example .env

The .env is located relative to the package source, so it is read when the server runs from a source checkout or an editable install (pip install -e ., the install documented above). A regular pip install . or a wheel does not read it; pass the settings as environment variables instead. The Docker image is unaffected: its Dockerfile installs the package editable, and the Compose example above passes the file through env_file: as environment variables anyway. When no .env was read and the settings fail to load, the startup error names the path that was checked.

Edit .env with your FortiManager settings:

# FortiManager Connection (Required)
FORTIMANAGER_HOST=192.168.1.100

# Authentication Option 1: API Token (Recommended)
FORTIMANAGER_API_TOKEN=your-api-token-here

# Authentication Option 2: Username/Password
# FORTIMANAGER_USERNAME=admin
# FORTIMANAGER_PASSWORD=your-password

# SSL Verification — keep this TRUE. For self-signed FortiManager certs,
# import the FortiManager CA into your trust store instead of disabling it
# (see docs/SETUP_GUIDE.md "Trusting the FortiManager CA"). Setting this to
# false disables TLS verification and exposes the connection to MITM attacks.
FORTIMANAGER_VERIFY_SSL=true

# Request Settings
FORTIMANAGER_TIMEOUT=30
FORTIMANAGER_MAX_RETRIES=3

# Logging
LOG_LEVEL=INFO  # DEBUG for troubleshooting

# Tool Loading Mode (important for context window optimization)
FMG_TOOL_MODE=full  # or "dynamic" for ~90% context reduction

# Default ADOM (optional - defaults to "root")
DEFAULT_ADOM=root

# HTTP Authentication (optional, recommended for Docker/HTTP deployments)
# MCP_AUTH_TOKEN=your-secret-token

# MCP Server Settings (for HTTP/Docker mode)
# MCP_SERVER_MODE=http     # "http" for Docker, "stdio" for Claude Desktop, "auto" to detect
# MCP_SERVER_HOST=0.0.0.0  # Bind address (0.0.0.0 for Docker)
# MCP_SERVER_PORT=8000      # Server port

# Allowed Host headers for HTTP/Docker deployments (optional)
# Set to the value clients use in their connection URL — NOT the client's IP.
# The MCP SDK rejects non-localhost Host headers by default for DNS rebinding protection.
# Examples: ["mcp.example.com"], ["10.1.5.62:8000"], or wildcard ["10.1.5.62:*"]
# MCP_ALLOWED_HOSTS=["mcp.example.com"]

# Streamable HTTP transport mode (optional - stateful by default)
# Set true behind a load balancer / multiple replicas, or a proxy that does not
# preserve the Mcp-Session-Id header, so each request is handled independently.
# MCP_STATELESS_HTTP=true

# HTTP request bounds (optional - bounded by default)
# MCP_MAX_REQUEST_BYTES=10485760     # Max request body; oversize gets 413. 0 disables.
# MCP_MAX_CONCURRENT_REQUESTS=64     # Max in-flight requests; excess gets 503. 0 disables.

# Reversible data masking (optional - off by default, issue #34)
# Masks IOC-bearing VALUES in tool outputs (IPs, subnets, serials, FQDNs,
# admin usernames). Names (object/ADOM/package/VDOM/device) route calls
# and are never masked. Masked values are read-only context: a token sent
# back as a tool argument is refused, so create and modify with real
# values. Requires 32/48/64 hex chars; enabling without a key aborts
# startup. Shares token compatibility with the FortiAnalyzer sibling when
# both use the same key, which also means one shared blast radius.
# MASKING_ENABLED=false
# FMG_MASKING_KEY=

# Safety Guardrails (optional - strict by default)
# FMG_SCRIPT_SAFETY=strict    # Block dangerous CLI commands in scripts (factory-reset, reboot, etc.)
# FMG_POLICY_SAFETY=strict    # Block overly permissive policies (srcaddr=all + dstaddr=all + accept)

Tool Loading Modes

FortiManager MCP supports two tool loading modes to optimize context window usage:

Mode

Tools Loaded

Context Usage

Best For

full (default)

All 232 tools

~100%

Large context windows, full functionality

dynamic

4 discovery tools

~10%

Smaller context windows, on-demand loading

Full Mode (default): All 232 tools are loaded at startup. Best when you have sufficient context window and need immediate access to all FortiManager operations.

Dynamic Mode: Only lightweight discovery tools are loaded:

  • find_fortimanager_tool(operation) - Search for tools by keyword

  • list_fortimanager_categories() - List tool categories

  • execute_fortimanager_tool(name, params) - Execute any tool by name

  • health_check() - Server health status

To enable dynamic mode:

FMG_TOOL_MODE=dynamic

Default ADOM

The DEFAULT_ADOM environment variable sets the default Administrative Domain (ADOM) for all FortiManager operations. When a tool is called without specifying an ADOM, this value is used.

DEFAULT_ADOM=root  # default value

This is particularly useful when:

  • Your FortiManager only uses a single ADOM

  • Most of your work is within one specific ADOM

  • You want to avoid repeatedly specifying the ADOM in each tool call

If not set, defaults to root (the global ADOM).

Default Device

The DEFAULT_DEVICE environment variable sets a fallback managed device for device-scoped tools (e.g. get_device_client_location, get_device_interface_config, get_device_sdwan_monitor). When such a tool is called without a device, this value is used.

DEFAULT_DEVICE=myfw01   # unset by default

It is unset by default because there is no universal device name. Setting it is recommended for single-FortiGate deployments (and when driving the tools from an LLM, which may omit device if it treats it as an implied default) — the tool then resolves to DEFAULT_DEVICE instead of erroring. If neither a device argument nor DEFAULT_DEVICE is provided, the tool returns a clear device_required error.

Generating an API Token

  1. Log into FortiManager web interface

  2. Go to System Settings > Admin > Administrators

  3. Edit your admin user or create a new one

  4. Under JSON API Access, click Regenerate or New API Key

  5. Copy the generated token

Running the Server

Standalone Mode

# Using the installed command
fortimanager-mcp

# Or using Python module
python -m fortimanager_mcp

Claude Desktop Integration

Add to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "fortimanager": {
      "command": "/path/to/fortimanager-mcp/.venv/bin/fortimanager-mcp",
      "env": {
        "FORTIMANAGER_HOST": "your-fmg-hostname",
        "FORTIMANAGER_API_TOKEN": "your-api-token",
        "FORTIMANAGER_VERIFY_SSL": "true",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

Note: Use the full path to the fortimanager-mcp executable in your virtual environment.

Claude Code Integration

Add to ~/.claude/mcp_servers.json:

{
  "mcpServers": {
    "fortimanager": {
      "command": "/path/to/fortimanager-mcp/.venv/bin/fortimanager-mcp",
      "env": {
        "FORTIMANAGER_HOST": "your-fmg-hostname",
        "FORTIMANAGER_API_TOKEN": "your-api-token",
        "FORTIMANAGER_VERIFY_SSL": "true",
        "DEFAULT_ADOM": "root",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

Docker Mode

# Start the server
docker compose up -d

# View logs
docker compose logs -f

# Stop the server
docker compose down

HTTP Mode (Remote Access)

When running in HTTP mode (Docker or standalone with MCP_SERVER_MODE=http), MCP clients connect via the Streamable HTTP transport:

Claude Code (~/.claude/mcp_servers.json):

{
  "mcpServers": {
    "fortimanager": {
      "type": "streamable-http",
      "url": "https://your-mcp-host.example.com/mcp",
      "headers": {
        "Authorization": "Bearer your-mcp-auth-token"
      }
    }
  }
}

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "fortimanager": {
      "type": "streamable-http",
      "url": "https://your-mcp-host.example.com/mcp",
      "headers": {
        "Authorization": "Bearer your-mcp-auth-token"
      }
    }
  }
}

Production Deployment (Reverse Proxy)

For production deployments behind a TLS-terminating reverse proxy:

MCP Client → HTTPS → Reverse Proxy (Traefik/nginx) → HTTP → MCP Container → FortiManager

Key considerations:

  1. MCP_ALLOWED_HOSTS — The MCP SDK validates the Host header to prevent DNS rebinding attacks. By default only localhost and 127.0.0.1 are accepted. Set this to the value clients put in their connection URL (NOT the client's IP):

    # Reverse-proxy hostname (Traefik/nginx):
    MCP_ALLOWED_HOSTS=["mcp.example.com"]
    # Direct Docker exposure on IP+port:
    MCP_ALLOWED_HOSTS=["10.1.5.62:8000"]
    # Port wildcard (any port on the host):
    MCP_ALLOWED_HOSTS=["10.1.5.62:*"]
  2. MCP_AUTH_TOKEN — Always set a Bearer token for HTTP deployments:

    MCP_AUTH_TOKEN=$(openssl rand -hex 32)
  3. Secrets management — Keep API tokens and auth tokens in an env_file (.env), not inline in docker-compose.yml.

  4. MCP_STATELESS_HTTP — When the server runs behind a load balancer or as multiple replicas (or behind a proxy that does not preserve the Mcp-Session-Id header), enable stateless mode so each request is self-contained and no sticky sessions are required:

    MCP_STATELESS_HTTP=true

    Leave it unset (stateful, the default) for single-instance deployments. Stateless mode disables server-initiated streaming that relies on a persistent session.

Example with Traefik:

services:
  fortimanager-mcp:
    image: ghcr.io/rstierli/fortimanager-mcp:latest
    container_name: fortimanager-mcp
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    env_file:
      - .env
    environment:
      - MCP_SERVER_MODE=http
      - MCP_SERVER_HOST=0.0.0.0
      - MCP_SERVER_PORT=8000
      - FORTIMANAGER_HOST=your-fmg-hostname
      # Keep TLS verification on; import the FortiManager CA for self-signed
      # certs. FORTIMANAGER_VERIFY_SSL=false disables MITM protection.
      - FORTIMANAGER_VERIFY_SSL=true
      - MCP_ALLOWED_HOSTS=["mcp.example.com"]
      - DEFAULT_ADOM=root
      - FMG_TOOL_MODE=full
      - LOG_LEVEL=INFO
    networks:
      - frontend
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.fmg-mcp-secure.entrypoints=https"
      - "traefik.http.routers.fmg-mcp-secure.rule=Host(`mcp.example.com`)"
      - "traefik.http.routers.fmg-mcp-secure.tls=true"
      - "traefik.http.services.fmg-mcp.loadbalancer.server.port=8000"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

networks:
  frontend:
    external: true

Available Tools (232 tools)

System Tools (17 tools)

Tool

Description

get_system_status

Get FortiManager system status and version info

get_ha_status

Get High Availability cluster status

list_adoms

List all Administrative Domains

get_adom

Get specific ADOM details

list_devices

List devices in an ADOM

get_device

Get specific device information

list_device_groups

List device groups in an ADOM

list_tasks

List background tasks

get_task

Get task details by ID

wait_for_task

Wait for a task to complete

list_packages

List policy packages in an ADOM

get_package

Get policy package details

install_package

Install policy package to devices

install_device_settings

Install device settings only

lock_adom

Lock ADOM for editing (workspace mode)

unlock_adom

Unlock ADOM

commit_adom

Commit ADOM changes

Device Management Tools (14 tools)

Tool

Description

list_device_vdoms

List VDOMs for a device

get_device_status

Get device connection and sync status

search_devices

Search devices with filters

add_device

Add a new device to FortiManager

add_model_device

Add offline model device

delete_device

Remove a device from FortiManager

add_devices_bulk

Add multiple devices at once

delete_devices_bulk

Remove multiple devices at once

update_device

Update device metadata

reload_device_list

Refresh device list cache

get_device_realtime_status

Get live device status

get_device_interfaces

Get device interface information

get_device_interface_config

Read device-DB interface config objects, filterable by VLAN id / interface name (maps a client IP to its VLAN/interface/port)

get_device_client_location

Asset Identity Center: locate a client (by ip/mac/hostname) via the live detected-device inventory — resolves the FortiAP/FortiSwitch, port and VLAN it is connected through

Device Configuration Tools (21 tools)

Typed device-DB configuration (issues #45, #52): everything is staged in FortiManager's device database and pushed with preview_install + install_device_settings; nothing talks to the FortiGate directly.

Tool

Description

create_device_interface

Create a VLAN subinterface (parent, vlanid, ip, allowaccess, role, alias)

update_device_interface

Update device-DB interface fields

delete_device_interface

Delete a device-DB interface

list_device_dhcp_servers

List DHCP server scopes in the device DB

create_device_dhcp_server

Create a DHCP scope (interface, range, netmask, gateway, DNS)

update_device_dhcp_server

Update a DHCP scope by id

delete_device_dhcp_server

Delete a DHCP scope by id

list_device_vaps

List wireless VAPs (SSIDs), passphrases stripped

create_device_vap

Create a wireless VAP/SSID with security mode and VLAN mapping

delete_device_vap

Delete a wireless VAP

assign_vap_to_wtp_profile

Add a VAP to FortiAP profile radios so the SSID broadcasts

list_device_wtp_profiles

List FortiAP (WTP) profiles in the device DB

get_device_wtp_profile

Get a FortiAP (WTP) profile, radios included

update_device_wtp_profile_radio

Update one radio's channel/channel-bonding, other fields untouched

list_device_wtps

List managed FortiAPs (wireless-controller wtp) in the device DB

get_device_wtp

Get a managed FortiAP by wtp-id (serial number)

create_device_wtp

Register a managed FortiAP (wtp-id, wtp-profile, authorization state)

update_device_wtp

Update a managed FortiAP's profile/name/admin/location/comment

delete_device_wtp

Delete a managed FortiAP registration

create_device_sniffer

Create a firewall sniffer definition (firewall sniffer) on the device itself, not FortiManager's own local sniffer

create_device_on_demand_sniffer

Create a bounded, name-keyed on-demand packet sniffer (firewall on-demand-sniffer), distinct from the persistent firewall sniffer object

Policy Tools (25 tools)

create_firewall_policy and update_firewall_policy accept security-profile (UTM) fields -- utm_status, av_profile, ips_sensor, webfilter_profile, dnsfilter_profile, application_list, file_filter_profile, ssl_ssh_profile, profile_protocol_options, profile_group -- so a policy can actually apply inspection, not just route traffic. profile_group is mutually exclusive with the individual profile fields it bundles; see "Security Profile Field Validation" under Safety Guardrails below.

Tool

Description

create_package

Create a new policy package

delete_package

Delete a policy package

clone_package

Clone an existing package

assign_package

Assign package to devices

list_firewall_policies

List policies in a package

get_firewall_policy

Get policy details

create_firewall_policy

Create a new firewall policy

update_firewall_policy

Update an existing policy

delete_firewall_policy

Delete a firewall policy

delete_firewall_policies_bulk

Bulk delete policies

move_firewall_policy

Reorder policy position

search_firewall_policies

Search policies with filters

get_policy_services

Get policy services with optional group resolution

preview_install

Preview installation changes

get_preview_result

Get preview results

create_local_in_policy

Create a new IPv4 local-in policy

create_local_in_policy6

Create a new IPv6 local-in policy

delete_local_in_policy

Delete an IPv4 local-in policy

delete_local_in_policy6

Delete an IPv6 local-in policy

get_local_in_policy

Get detailed information about a specific IPv4 local-in policy

get_local_in_policy6

Get detailed information about a specific IPv6 local-in policy

list_local_in_policies

List IPv4 local-in policies in a policy package

list_local_in_policies6

List IPv6 local-in policies in a policy package

update_local_in_policy

Update an existing IPv4 local-in policy

update_local_in_policy6

Update an existing IPv6 local-in policy

Object Tools (25 tools)

Tool

Description

list_addresses

List firewall address objects

get_address

Get address object details

create_address_subnet

Create subnet address

create_address_host

Create host address

create_address_fqdn

Create FQDN address

create_address_range

Create IP range address

update_address

Update address object

delete_address

Delete address object

list_address_groups

List address groups

get_address_group

Get address group details

create_address_group

Create address group

update_address_group

Update address group

delete_address_group

Delete address group

list_services

List service objects

get_service

Get service details

create_service_tcp_udp

Create TCP/UDP service

create_service_icmp

Create ICMP service

update_service

Update service object

delete_service

Delete service object

list_service_groups

List service groups

get_service_group

Get service group details

create_service_group

Create service group

update_service_group

Update service group members and comment

delete_service_group

Delete service group

search_objects

Search all object types

Script Tools (12 tools)

Tool

Description

list_scripts

List CLI scripts in ADOM

get_script

Get script content and details

create_script

Create a new CLI script

update_script

Update existing script

delete_script

Delete a script

execute_script_on_device

Run script on single device

execute_script_on_devices

Run script on multiple devices

execute_script_on_device_group

Run script on device group

execute_script_on_package

Run script on package/ADOM DB

get_script_log_latest

Get latest execution log

get_script_log_summary

Get execution history

get_script_log_output

Get specific log output

Template Tools (15 tools)

Tool

Description

list_templates

List provisioning templates

get_template

Get template details

list_system_templates

List system templates (devprof)

get_system_template

Get system template details

assign_system_template

Assign template to device

assign_system_template_bulk

Bulk assign system template

unassign_system_template

Remove template assignment

list_cli_template_groups

List CLI template groups

get_cli_template_group

Get CLI template group

create_cli_template_group

Create CLI template group

delete_cli_template_group

Delete CLI template group

list_template_groups

List template groups

get_template_group

Get template group

assign_template_group

Assign template group

validate_template

Validate template against device

SD-WAN Tools (10 tools)

Tool

Description

list_sdwan_templates

List SD-WAN templates

get_sdwan_template

Get SD-WAN template details

create_sdwan_template

Create SD-WAN template

delete_sdwan_template

Delete SD-WAN template

assign_sdwan_template

Assign template to device

assign_sdwan_template_bulk

Bulk assign SD-WAN template

unassign_sdwan_template

Remove template assignment

get_device_sdwan

Read a device's SD-WAN config (members/zones/health-checks/rules) from the device DB — for SD-WAN configured locally, not via a template

get_device_sdwan_monitor

Live SD-WAN Monitor via the device proxy — per-member link/bandwidth (virtual-wan/members) + per-member SLA health (virtual-wan/health-check)

resolve_datasource

Generic config-DB introspection: resolve the objects a config attribute is allowed to reference (option: datasrc)

Security Profile Tools (20 tools)

Tool

Description

create_antivirus_profile

Create an antivirus profile

create_application_list

Create an application-control list

create_dnsfilter_profile

Create a DNS filter profile

create_webfilter_profile

Create a web filter profile

delete_antivirus_profile

Delete an antivirus profile

delete_application_list

Delete an application-control list

delete_dnsfilter_profile

Delete a DNS filter profile

delete_webfilter_profile

Delete a web filter profile

get_antivirus_profile

Get detailed information about an antivirus profile

get_application_list

Get detailed information about an application-control list

get_dnsfilter_profile

Get detailed information about a DNS filter profile

get_webfilter_profile

Get detailed information about a web filter profile

list_antivirus_profiles

List antivirus profiles in an ADOM

list_application_lists

List application-control lists in an ADOM

list_dnsfilter_profiles

List DNS filter profiles in an ADOM

list_webfilter_profiles

List web filter profiles in an ADOM

update_antivirus_profile

Update an existing antivirus profile

update_application_list

Update an existing application-control list

update_dnsfilter_profile

Update an existing DNS filter profile

update_webfilter_profile

Update an existing web filter profile

Security Profile (Advanced) Tools (23 tools)

Tool

Description

add_ips_sensor_signature_override

Add a signature filter/override entry to an IPS sensor

create_dlp_profile

Create a DLP (Data Loss Prevention) profile

create_ips_sensor

Create an IPS sensor

create_ssl_ssh_profile

Create an SSL/SSH inspection profile

create_waf_profile

Create a WAF (Web Application Firewall) profile

delete_dlp_profile

Delete a DLP profile

delete_ips_sensor

Delete an IPS sensor

delete_ssl_ssh_profile

Delete an SSL/SSH inspection profile

delete_waf_profile

Delete a WAF profile

get_dlp_profile

Get detailed information about a DLP profile

get_ips_sensor

Get detailed information about an IPS sensor

get_ssl_ssh_profile

Get detailed information about an SSL/SSH inspection profile

get_waf_profile

Get detailed information about a WAF profile

list_dlp_profiles

List DLP (Data Loss Prevention) profiles in an ADOM

list_ips_sensor_signature_overrides

List the signature-filter/override entries of an IPS sensor

list_ips_sensors

List IPS sensors in an ADOM

list_ssl_ssh_profiles

List SSL/SSH inspection profiles in an ADOM

list_waf_profiles

List WAF (Web Application Firewall) profiles in an ADOM

remove_ips_sensor_signature_override

Remove a signature filter/override entry from an IPS sensor

update_dlp_profile

Update a DLP profile's top-level settings

update_ips_sensor

Update an IPS sensor's top-level settings

update_ssl_ssh_profile

Update an SSL/SSH inspection profile

update_waf_profile

Update a WAF profile's top-level settings

VPN Tools (14 tools)

Tool

Description

create_device_ipsec_phase1_interface

Create an IPsec phase1-interface (remote gateway / IKE SA) in a device's device DB

create_device_ipsec_phase2_interface

Create an IPsec phase2-interface (tunnel/traffic selector) in a device's device DB

delete_device_ipsec_phase1_interface

Delete an IPsec phase1-interface from a device's device DB

delete_device_ipsec_phase2_interface

Delete an IPsec phase2-interface from a device's device DB

get_device_ipsec_phase1_interface

Get one IPsec phase1-interface (remote gateway) from a device's device DB

get_device_ipsec_phase2_interface

Get one IPsec phase2-interface (tunnel/selector) from a device's device DB

get_device_sslvpn_settings

Get the SSL-VPN (Agentless VPN) settings object from a device's device DB

get_device_sslvpn_web_portal

Get an SSL-VPN web portal from a device's device DB

list_device_ipsec_phase1_interfaces

List IPsec phase1-interface (remote gateway) definitions in a device's device DB

list_device_ipsec_phase2_interfaces

List IPsec phase2-interface (tunnel/selector) definitions in a device's device DB

update_device_ipsec_phase1_interface

Update fields on a device-DB IPsec phase1-interface, unspecified fields unchanged

update_device_ipsec_phase2_interface

Update fields on a device-DB IPsec phase2-interface, unspecified fields unchanged

update_device_sslvpn_settings

Update the SSL-VPN (Agentless VPN) settings object in a device's device DB

update_device_sslvpn_web_portal

Update an SSL-VPN web portal in a device's device DB

Revision History Tools (11 tools)

Tool

Description

diff_adom_revision

Diff a past ADOM DB revision against the CURRENT live ADOM

diff_device_revision

Diff a past device DB revision against the CURRENT device DB

diff_policy_package

Diff a policy package's objects at a past ADOM revision against its CURRENT live state

get_adom_revision

Get one ADOM DB revision's metadata

get_device_revision

Check out one device DB revision's stored configuration text

list_adom_revisions

List the ADOM DB revision history for an ADOM

list_device_revisions

List the device DB revision history for a managed device

list_policy_revisions

List the change log for a policy package's firewall policies

revert_adom_revision

Revert the live ADOM DB to a past revision

revert_device_revision

Revert a device's device DB to a past revision

revert_firewall_policy

Restore a firewall policy to a past change-log snapshot

FortiManager Operations Tools (9 tools)

Tool

Description

add_packet_capture

Add a new FortiManager packet capture definition

delete_task

Delete a task record from FortiManager's task list

get_fmg_license

Get the FortiManager license/contract status

get_packet_capture_status

Get the running/packet-count status of packet captures

list_packet_captures

List existing FortiManager packet capture definitions

start_packet_capture

Start a packet capture from an existing definition

stop_packet_capture

Stop a running packet capture

trigger_fmg_backup

Trigger a FortiManager system backup to a remote server

trigger_fmg_restore

Restore the FortiManager system from a backup on a remote server

Device Group Tools (8 tools)

Tool

Description

add_device_to_group

Add a single device to a device group

add_devices_to_group_bulk

Add multiple devices to a device group in one call

add_group_to_group

Nest a device group inside another device group

create_device_group

Create a device group in FortiManager's device manager database

delete_device_group

Delete a device group from FortiManager

remove_device_from_group

Remove a single device from a device group

remove_devices_from_group_bulk

Remove multiple devices from a device group in one call

remove_group_from_group

Remove a nested group from its parent device group

Firmware Tools (5 tools)

Tool

Description

get_firmware_upgrade_path

Preview the multi-step firmware upgrade path to a target version

get_firmware_upgrade_report

Get the firmware upgrade report for a device under a named profile

list_available_firmware

List firmware versions available for a platform

list_firmware_images

List firmware image files stored on the FortiManager's local disk

upgrade_device_firmware

Trigger a firmware upgrade on a managed device

Object Usage Tools (2 tools)

Tool

Description

find_duplicate_objects

Find objects with identical content configured under different names

find_object_usage

Find everywhere an ADOM object is referenced (where-used)

Policy Lookup Tools (1 tool)

Tool

Description

policy_lookup

Simulate a firewall policy lookup for a traffic 5-tuple against a managed device

Usage Examples

Policy Management

"List all firewall policies in the 'default' package"
"Create a new policy to allow HTTP traffic from internal to wan1"
"Move policy 10 before policy 5 in the default package"
"Install the branch-policy package to FGT-01"

Object Management

"Create an address object for the web server at 192.168.10.10"
"List all address groups in the root ADOM"
"Create a service for TCP port 8443"
"Search for all objects containing 'web' in the name"

Device Management

"List all devices in the root ADOM"
"Add a new FortiGate device at 10.0.0.1"
"Get the connection status for FGT-01"
"Show the VDOMs configured on FGT-01"

Script Execution

"List all CLI scripts in the root ADOM"
"Create a backup script that runs 'execute backup config ftp'"
"Execute the backup script on FGT-01"
"Show the latest script execution log for FGT-01"

Template Management

"List all system templates in the ADOM"
"Assign the 'Branch-Template' to FGT-01"
"Show available SD-WAN templates"
"Validate the template against device FGT-01"

System Operations

"What is the FortiManager system status?"
"Lock the root ADOM for editing"
"Show all running tasks"
"Wait for task 123 to complete"

Architecture

fortimanager-mcp/
├── src/fortimanager_mcp/
│   ├── api/
│   │   └── client.py          # FortiManager API client (JSON-RPC)
│   ├── tools/
│   │   ├── system_tools.py    # System, ADOM, task management
│   │   ├── dvm_tools.py       # Device management tools
│   │   ├── policy_tools.py    # Policy and package tools
│   │   ├── object_tools.py    # Address, service objects
│   │   ├── script_tools.py    # CLI script tools
│   │   ├── template_tools.py  # Provisioning templates
│   │   └── sdwan_tools.py     # SD-WAN templates
│   ├── utils/
│   │   ├── config.py          # Configuration management
│   │   └── errors.py          # Error handling
│   └── server.py              # MCP server implementation
├── tests/                     # Test suite (190+ tests)
├── docs/                      # API documentation
├── .env.example               # Example configuration
├── pyproject.toml             # Project configuration
├── Dockerfile                 # Container image definition
└── docker-compose.yml         # Container orchestration

API Reference

The server communicates with FortiManager using the JSON-RPC API over HTTPS. All requests are sent to the /jsonrpc endpoint.

Supported FortiManager Versions

  • FortiManager 7.0.x

  • FortiManager 7.2.x

  • FortiManager 7.4.x

  • FortiManager 7.6.x (primary development target)

Authentication Methods

  1. API Token (Recommended)

    • More secure, no session management

    • Tokens can be revoked without changing passwords

    • Works with FortiManager 7.0+

  2. Username/Password

    • Traditional session-based authentication

    • Session automatically managed by the client

Troubleshooting

Enable Debug Logging

Set LOG_LEVEL=DEBUG in your environment to see detailed API requests and responses:

LOG_LEVEL=DEBUG fortimanager-mcp

Common Issues

Connection Failed

  • Verify FortiManager hostname/IP is correct

  • Check network connectivity and firewall rules

  • Ensure HTTPS port (443) is accessible

Authentication Failed

  • Verify API token or credentials are correct

  • Check if the admin account has API access enabled

  • Ensure the account has sufficient permissions

SSL Certificate Errors

  • For self-signed FortiManager certs, import the FortiManager CA certificate into your trust store and keep FORTIMANAGER_VERIFY_SSL=true (see SETUP_GUIDE.md → "Trusting the FortiManager CA")

  • For production, use valid SSL certificates signed by a trusted CA

  • Last resort only: FORTIMANAGER_VERIFY_SSL=false disables TLS verification and exposes the connection to man-in-the-middle attacks — avoid in production

ADOM Locked

  • Another user may have the ADOM locked

  • Use unlock_adom to release the lock (requires permissions)

  • Check workspace mode settings in FortiManager

MCP Transport Issues

Invalid Host header (HTTP/Docker mode)

Symptom — server logs show:

mcp.server.transport_security - WARNING - Invalid Host header: 10.x.y.z:8000
INFO:     ... "POST /mcp HTTP/1.1" 421 Misdirected Request

Cause: the MCP SDK validates the Host header for DNS rebinding protection. By default only localhost and 127.0.0.1 are accepted. The header value is whatever the client puts in its connection URL — not the client's IP.

Fix: add the URL value (with port, if used) to MCP_ALLOWED_HOSTS:

# If the client connects to http://10.1.5.62:8000/mcp:
MCP_ALLOWED_HOSTS=["10.1.5.62:8000"]
# Or use a port wildcard to allow any port on that host:
MCP_ALLOWED_HOSTS=["10.1.5.62:*"]
# For a reverse-proxy hostname:
MCP_ALLOWED_HOSTS=["mcp.example.com"]

PermissionError: pyvenv.cfg (macOS stdio mode)

Symptom — Claude Desktop MCP logs show:

Fatal Python error: init_import_site: Failed to import the site module
PermissionError: [Errno 1] Operation not permitted: '.../.venv/pyvenv.cfg'

Cause: macOS TCC (Transparency, Consent, Control) blocks Claude Desktop from launching executables from inside ~/Documents, ~/Desktop, or ~/Downloads.

Fix (preferred): move the project out of those folders, recreate the venv, and update Claude Desktop's MCP config to the new path:

mv ~/Documents/mcp ~/mcp
cd ~/mcp/fortimanager-mcp
rm -rf .venv && uv sync
# Then update the "command" path in claude_desktop_config.json

Fix (alternative): grant Claude Desktop Full Disk Access — System Settings → Privacy & Security → Full Disk Access → add Claude. Broader permission; only use if relocation isn't feasible.

Viewing Logs

Claude Desktop MCP Server Logs:

  • macOS: ~/Library/Logs/Claude/mcp-server-fortimanager.log

  • Windows: %APPDATA%\Claude\logs\mcp-server-fortimanager.log

Development

Running Tests

The project includes 190+ tests covering all tool modules, error handling, and validation logic.

# Install dev dependencies
uv sync --all-extras

# Run all unit tests
pytest

# Run with coverage report
pytest --cov=src/fortimanager_mcp --cov-report=html

# Run specific test file
pytest tests/test_policy_tools.py -v

# Run tests with verbose output
pytest -v

Integration Tests

Integration tests require a real FortiManager instance and are not run in CI.

# Set up environment
export FORTIMANAGER_HOST=your-fmg-host
export FORTIMANAGER_API_TOKEN=your-token
# Keep verification on; import the FortiManager CA for self-signed certs.
export FORTIMANAGER_VERIFY_SSL=true

# Run integration tests (requires live FMG)
pytest tests/integration/ -v

Note: Integration tests are verified against FortiManager 7.6.2. Some features may behave differently on older versions.

CI Workflow

The project uses GitHub Actions for continuous integration:

  • Linting: ruff check on all source files

  • Type checking: mypy with strict mode

  • Unit tests: pytest with coverage reporting

  • Python versions: 3.12+

All CI checks must pass before merging pull requests.

Code Quality

# Linting
ruff check src/

# Type checking
mypy src/

# Formatting
ruff format src/

Security Considerations

HTTP Authentication

When running in HTTP mode (Docker), you can secure the MCP endpoint with Bearer token authentication:

# Set in .env or environment
MCP_AUTH_TOKEN=your-secret-token

When configured, all HTTP requests (except /health) must include the Authorization: Bearer <token> header. If not set, the server runs without authentication (backwards compatible).

Environment File Permissions

Protect your .env files containing API tokens:

chmod 600 .env .env.*

Dynamic Tool Dispatch Security

In dynamic mode, the tool dispatcher validates tool names:

  • Rejects private/internal functions (underscore-prefixed names)

  • Validates that resolved attributes are callable

  • Error responses never include request parameters (prevents credential leakage)

Safety Guardrails

The MCP server includes built-in safety checks to prevent accidental damage to managed infrastructure. Both are enabled by default.

Script Content Safety (FMG_SCRIPT_SAFETY)

Blocks dangerous CLI commands in create_script and update_script:

Blocked Command

Risk

execute factory-reset

Wipes device configuration

execute reboot

Causes device outage

execute shutdown

Powers off device

execute format

Formats device disk

execute erase-disk

Erases device disk

Handles FortiOS abbreviations (exec for execute) and case variations.

FMG_SCRIPT_SAFETY=strict    # Default: block dangerous commands
FMG_SCRIPT_SAFETY=disabled  # Allow all commands (use with extreme caution)

Policy Permissiveness Safety (FMG_POLICY_SAFETY)

Blocks overly permissive firewall policies in create_firewall_policy and update_firewall_policy. Detects policies where srcaddr=all + dstaddr=all + action=accept, which allows unrestricted traffic.

FMG_POLICY_SAFETY=strict    # Default: block overly permissive policies
FMG_POLICY_SAFETY=warn      # Allow but include warning in response
FMG_POLICY_SAFETY=disabled  # Allow all policies

Restore Safety (FMG_RESTORE_SAFETY)

Blocks trigger_fmg_restore (replaces FortiManager's entire configuration and interrupts the service) unless the caller also passes confirm=True.

FMG_RESTORE_SAFETY=strict    # Default: refuse without confirm=True
FMG_RESTORE_SAFETY=disabled  # Allow unconditionally

Revert Safety (FMG_REVERT_SAFETY)

Blocks revert_adom_revision (restores the entire live ADOM DB in one call) and revert_device_revision (rewrites a device's entire stored config from a revision) unless the caller also passes confirm=True.

FMG_REVERT_SAFETY=strict    # Default: refuse without confirm=True
FMG_REVERT_SAFETY=disabled  # Allow unconditionally

Firmware Upgrade Safety (FMG_FIRMWARE_SAFETY)

Blocks upgrade_device_firmware (reboots the real managed device) unless the caller also passes confirm=True.

FMG_FIRMWARE_SAFETY=strict    # Default: refuse without confirm=True
FMG_FIRMWARE_SAFETY=disabled  # Allow unconditionally

Security Profile Field Validation

create_firewall_policy and update_firewall_policy validate security-profile (UTM) field combinations before sending the payload to FortiManager, so an invalid combination fails with a clear message instead of an opaque FMG error code. This check always runs (no environment toggle):

  • profile_group is mutually exclusive with av_profile, ips_sensor, webfilter_profile, dnsfilter_profile, application_list, file_filter_profile, ssl_ssh_profile, and profile_protocol_options -- FortiOS rejects a policy that sets both a security-profile group and any individual profile it bundles. profile_protocol_options is itself a member of the firewall profile-group object, so it is part of this exclusion set too.

  • Setting any of the fields above together with utm_status=False in the same call is rejected -- FortiOS ignores security profiles when utm-status is disabled, so the combination is almost certainly a mistake.

General Security

  • API Tokens: Store tokens securely, never commit to version control

  • SSL Verification: Enable SSL verification in production environments

  • Least Privilege: Use FortiManager accounts with minimal required permissions

  • Network Security: Restrict access to FortiManager management interface

  • Workspace Locking: Use ADOM locking to prevent concurrent modifications

  • Credential Sanitization: Device credentials are automatically stripped from API responses

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines on how to submit bug reports, feature requests, and pull requests.

License

MIT License - See LICENSE file for details.

Acknowledgments

  • fortianalyzer-mcp - MCP server for FortiAnalyzer with 70+ tools

  • pyfmg - FortiManager/FortiAnalyzer Python library

Author

Roland Stierli

Available Tools

233 tools
add_deviceA

Add a new device to FortiManager.

Registers a device with FortiManager for central management. Can add either a real device (with IP) or a model device (with serial number).

Args: adom: ADOM name where device will be added name: Device display name ip: Device IP address (for real device connection) serial_number: Device serial number (for model device or validation) admin_user: Admin username for device connection admin_pass: Admin password for device connection description: Device description platform: Platform type (default: "FortiGate-VM64") mgmt_mode: Management mode - "fmg" (FortiManager only), or "fmgfaz" (both) flags: Additional flags like ["create_task"]

Returns: dict: Add result with keys: - status: "success" or "error" - device: Added device information - task_id: Task ID if run as background task - message: Error message if failed

Example: >>> # Add a FortiGate with IP >>> result = await add_device( ... adom="root", ... name="FGT-Branch1", ... ip="192.168.1.1", ... admin_user="admin", ... admin_pass="password123" ... )

>>> # Add a model device (offline provisioning)
>>> result = await add_device(
...     adom="root",
...     name="FGT-Lab",
...     serial_number="FGVM020000123456"
... )
NameRequiredDescriptionDefault
ipNo
adomYes
nameYes
flagsNo
platformNoFortiGate-VM64
mgmt_modeNofmg
admin_passNo
admin_userNo
descriptionNo
serial_numberNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries full burden. It describes the return dictionary (status, device, task_id, message) and provides examples. It could disclose more about error handling or what happens if a device already exists, but overall it is transparent about core behavior.

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

Conciseness4/5

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

The description is well-structured with Args, Returns, and Examples sections. It is informative without being overly verbose, though it could be slightly more concise by merging some explanatory lines.

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

Completeness4/5

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

Given the complexity (10 parameters, no annotations) and the presence of an output schema, the description is comprehensive. It covers device types, required vs optional parameters, return format, and examples. Minor omission: it does not explain possible values for mgmt_mode beyond the default.

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

Parameters5/5

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

The schema has 0% description coverage, so the description must add meaning for all parameters. It thoroughly explains each parameter (adom, name, ip, serial_number, admin_user, admin_pass, description, platform, mgmt_mode, flags) with defaults and examples, far exceeding basic schema information.

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

Purpose5/5

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

The description explicitly states 'Add a new device to FortiManager' and distinguishes between adding a real device (with IP) and a model device (with serial number). This effectively differentiates it from sibling tools like add_model_device and add_devices_bulk.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool by detailing two use cases (real device with IP, model device with serial number) with examples. However, it does not explicitly state when not to use it or mention alternatives like add_model_device, which could lead to slight ambiguity.

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

add_devices_bulkA

Add multiple devices to FortiManager in bulk.

Registers multiple devices at once for efficiency.

Args: adom: ADOM name where devices will be added devices: List of device configurations. Each device dict can contain: - name: Device display name (required) - ip: Device IP address - sn: Serial number - adm_usr: Admin username - adm_pass: Admin password - desc: Description - platform_str: Platform type - os_ver: OS version flags: Additional flags like ["create_task"]

Returns: dict: Bulk add result with keys: - status: "success" or "error" - requested_count: Number of devices in the request. NOT a count of devices actually added: the add runs as a task, so per-device results only exist once it completes. - task_id: Task ID if run as background task - message: Error message if failed

Example: >>> devices = [ ... {"name": "FGT-Site1", "ip": "10.0.1.1", "adm_usr": "admin", "adm_pass": "pass1"}, ... {"name": "FGT-Site2", "ip": "10.0.2.1", "adm_usr": "admin", "adm_pass": "pass2"}, ... ] >>> result = await add_devices_bulk("root", devices)

NameRequiredDescriptionDefault
adomYes
flagsNo
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that the add runs as a background task, that requested_count is not a count of devices actually added, and that per-device results only exist after task completion. It omits permission/auth requirements and partial-failure behavior, which are the remaining material gaps for a mutation tool.

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

Conciseness4/5

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

Structured as statement, Args, Returns, Example, and the essential facts are front-loaded. The second sentence ('Registers multiple devices at once for efficiency') is largely redundant with the first, and the Returns block partly duplicates the output schema, but the worked example earns its space for a nested-dict payload.

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

Completeness4/5

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

For a bulk mutation tool with an output schema present, the description is nearly sufficient: it covers tenant scoping, the device payload shape, and the asynchronous task semantics. It stops short on operational prerequisites (ADOM locking, existing device registration, permission requirements) that an agent would need before firing the call.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate and largely does: every field of the nested device dict is enumerated with a required marker on name, plus adm_usr/adm_pass/platform_str meanings the bare schema would leave opaque. The flags parameter is only illustrated with a single example value (["create_task"]) without explaining what other flags are valid.

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

Purpose4/5

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

The first two sentences state a specific verb (add/register) and resource (multiple devices / devices in bulk) scoped to FortiManager, and the ADOM arg confirms the tenant scope. It does not explicitly distinguish itself from the single-device siblings (add_device, add_model_device) or from add_devices_to_group_bulk, which a reader must infer.

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

Usage Guidelines3/5

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

'Registers multiple devices at once for efficiency' implies the bulk-vs-single tradeoff, but there is no explicit when-to-use statement, no named alternative, and no prerequisites (ADOM lock, credential validity, whether devices must be pre-registered). Usage context is implied rather than stated.

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

add_devices_to_group_bulkA

Add multiple devices to a device group in one call.

Non-destructive: existing group members are preserved. All devices are added on the same VDOM; call add_device_to_group individually for devices that need a different VDOM.

Args: adom: ADOM name group: Target device group name devices: List of device names to add vdom: VDOM to add each device on (default: "root")

Returns: dict: Add result with keys: - status: "success" or "error" - requested_count: Number of devices in the request. NOT a count of memberships actually changed: FortiManager reports no per-member result, so a device that does not exist or is already a member is indistinguishable from one that was added. - message: Status or error message

Example: >>> result = await add_devices_to_group_bulk( ... "root", "Branch-Firewalls", ["FGT-Site1", "FGT-Site2"] ... )

NameRequiredDescriptionDefault
adomYes
vdomNoroot
groupYes
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it declares the operation non-destructive, preserves existing members, explains the same-VDOM constraint, and warns that requested_count is not a count of changed memberships because FortiManager gives no per-member result.

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

Conciseness5/5

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

The description is front-loaded with the core operation, then uses clear Args, Returns, and Example sections. The return-value caveat is not padding; it prevents a likely misinterpretation of requested_count.

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

Completeness5/5

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

For a bulk mutation tool with no annotations, 0% schema parameter descriptions, and an output schema, the description supplies the missing behavioral semantics, parameter meanings, expected return shape, and the relevant alternative tool.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate. It documents all four parameters with meaning: ADOM name, target device group name, list of device names, and VDOM with its default of 'root', plus the same-VDOM caveat.

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

Purpose5/5

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

The description opens with a specific verb and resource: adding multiple devices to a device group in one call. It clearly distinguishes this bulk operation from the singular sibling add_device_to_group by explaining the same-VDOM constraint.

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

Usage Guidelines5/5

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

It explicitly states that all devices are added on the same VDOM and directs the caller to add_device_to_group individually for devices needing a different VDOM. That is a concrete when-to-use-this-vs-alternative rule.

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

add_device_to_groupA

Add a single device to a device group.

Non-destructive: existing group members are preserved.

Args: adom: ADOM name group: Target device group name device: Device name to add vdom: Device VDOM to add (default: "root")

Returns: dict: Add result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await add_device_to_group("root", "Branch-Firewalls", "FGT-Branch1")

NameRequiredDescriptionDefault
adomYes
vdomNoroot
groupYes
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the operation is non-destructive and describes the return status/message keys, but it does not mention permission requirements, idempotency, behavior when the device is already in the group, or error conditions.

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

Conciseness5/5

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

The description is front-loaded with the core action and then uses compact Args/Returns/Example sections. The structure is easy to scan, and the example adds practical clarity without excessive verbosity.

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

Completeness4/5

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

For a simple single-device add operation, the description covers parameters, the non-destructive behavior, return keys, and an example. An output schema exists, so return details need not be exhaustive, but missing permission/error context keeps it from being fully complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It labels all four parameters and states the vdom default of 'root', but it does not clarify constraints, expected formats, or ADOM/device/group naming rules.

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

Purpose5/5

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

The description states a specific verb and resource: 'Add a single device to a device group.' The word 'single' distinguishes it from the sibling bulk tool add_devices_to_group_bulk, so an agent can select it without opening the schema.

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

Usage Guidelines4/5

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

It gives clear context for adding one device and notes that existing group members are preserved, making the non-destructive nature explicit. It does not explicitly name alternatives such as add_devices_to_group_bulk or remove_device_from_group, so there is no full when/when-not routing guidance.

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

add_group_to_groupA

Nest a device group inside another device group.

A group member has no VDOM (unlike a device member), which is what distinguishes a nested-group entry from a device entry in the dvmdb group membership list.

Args: adom: ADOM name parent_group: Group that will contain child_group child_group: Group to nest inside parent_group

Returns: dict: Add result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await add_group_to_group("root", "All-Branches", "Branch-Firewalls")

NameRequiredDescriptionDefault
adomYes
child_groupYes
parent_groupYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose the resulting entry's shape (no VDOM) and the success/error status contract, but it omits prerequisites such as whether the parent and child groups must already exist, whether the call is idempotent, what happens on duplicate nesting, and required permissions.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then the useful VDOM distinction, then args and a concrete example. The Returns block largely restates the output schema, so a small amount of content is redundant, but nothing is bloated.

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

Completeness4/5

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

For a simple three-string, all-required mutation with an output schema present, the description covers purpose, arg meaning, and example. The remaining gap is failure semantics (already nested, missing group, locked ADOM), which an agent would want before calling.

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

Parameters4/5

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

Schema coverage is 0% and the schema only carries bare titles, so the Args block is doing real work: it clarifies ADOM scoping and, importantly, the parent/child directionality ('group that will contain' vs 'group to nest inside'). It stops short of adding naming format or cross-ADOM constraints.

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

Purpose4/5

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

States a specific verb+resource pair: nest a device group inside another device group. The VDOM note distinguishes a nested-group membership entry from a device entry, which implicitly separates this from add_device_to_group, but it never names the sibling tools (add_device_to_group, remove_group_from_group) directly.

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

Usage Guidelines3/5

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

Usage context is implied by the operation (creating a nested-group membership) but there is no explicit when-to-use / when-not-to-use guidance and no pointer to the obvious complements, add_device_to_group or remove_group_from_group, which an agent could easily confuse with this call.

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

add_ips_sensor_signature_overrideA

Add a signature filter/override entry to an IPS sensor.

FortiManager exposes an IPS sensor's "entries" list as its own addressable nested collection (its own add/get/set/update/delete/move endpoints under .../sensor/{sensor}/entries), so this calls that sub-resource's ADD endpoint directly rather than reading the whole sensor, splicing the list in Python, and writing it back -- unlike update_device_wtp_profile_radio's device-DB radio field, which has no such sub-resource and must be read-modify-written as a whole object.

Pass rule with explicit signature names to override specific signatures (e.g. ["trojan.generic"]); omit it and use severity / default_action / default_status to add a broad filter entry instead (matches every signature meeting those criteria).

Args: adom: ADOM name sensor: IPS sensor name (must already exist -- see create_ips_sensor) rule: Specific signature names to override (optional; omit for a broad filter entry) entry_id: Explicit entry ID (0-4294967295). If omitted, FortiManager assigns the next available ID. status: Status of the entry ("disable", "enable", or "default"; default: "enable") action: Action for matched traffic ("pass", "block", "reset", or "default"; default: "default") log: Enable/disable logging for this entry ("enable" or "disable") log_packet: Enable/disable packet logging for this entry ("enable" or "disable") severity: Signature severities to match (e.g. ["critical", "high"]) default_action: Broad-filter action filter ("block", "pass", or "all") default_status: Broad-filter status filter ("disable", "enable", or "all")

Returns: dict: Add result with keys: - status: "success" or "error" - sensor: Sensor name - message: Status or error message

Example: >>> # Override a specific signature to block+log >>> result = await add_ips_sensor_signature_override( ... adom="root", ... sensor="Custom-IPS", ... rule=["trojan.generic"], ... status="enable", ... action="block", ... log="enable", ... )

>>> # Add a broad "block all critical signatures" filter
>>> result = await add_ips_sensor_signature_override(
...     adom="root",
...     sensor="Custom-IPS",
...     severity=["critical"],
...     default_action="block",
...     status="enable",
...     action="block",
... )
NameRequiredDescriptionDefault
logNo
adomYes
ruleNo
actionNodefault
sensorYes
statusNoenable
entry_idNo
severityNo
log_packetNo
default_actionNo
default_statusNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that this calls the sub-resource ADD endpoint, that FortiManager auto-assigns entry_id when omitted, and that entries are appended to an existing sensor's entries list. It stops short of stating auth/permission requirements, duplicate-entry behavior, or whether a commit_adom is required for changes to take effect.

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

Conciseness4/5

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

Front-loaded with purpose, then usage semantics, then Args/Returns/Examples – well structured for an 11-parameter tool. The paragraph contrasting the nested sub-resource with update_device_wtp_profile_radio's read-modify-write is interesting rationale but does not help an agent decide or invoke, and the examples partly restate the Args docs.

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

Completeness4/5

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

For an 11-param mutation tool with no annotations, the definition covers inputs, return shape, and the two usage patterns thoroughly. Missing only secondary but real facts: whether a subsequent commit_adom is needed, and what happens on conflicting/duplicate entries for the same signature.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and it does: every one of the 11 params is documented with meaning, allowed values ('pass', 'block', 'reset', 'default'), defaults, and the entry_id range (0-4294967295). This adds substantial meaning the bare schema does not provide.

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

Purpose5/5

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

States a specific verb and resource ('Add a signature filter/override entry to an IPS sensor') and explains it writes to the nested 'entries' sub-collection of the sensor. The distinction from create_ips_sensor, list_ips_sensor_signature_overrides and remove_ips_sensor_signature_override is implied clearly, and differentiates from update_device_wtp_profile_radio by mechanism.

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

Usage Guidelines5/5

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

Explicitly gives the two mutually exclusive usage modes: pass `rule` for specific signature overrides, or omit it and use `severity`/`default_action`/`default_status` for a broad filter entry with concrete examples of both. It also states the precondition that the sensor must already exist and points to create_ips_sensor.

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

add_model_deviceA

Add a model device for offline provisioning.

Model devices allow pre-configuring policies and settings before the actual device connects to FortiManager. Useful for zero-touch provisioning workflows.

Args: adom: ADOM name where device will be added name: Device display name serial_number: Device serial number (e.g., "FGVM020000123456") platform: Platform type (default: "FortiGate-VM64") os_version: FortiOS version (default: "7.0") description: Device description

Returns: dict: Add result with keys: - status: "success" or "error" - device: Added device information - message: Status or error message

Example: >>> result = await add_model_device( ... adom="root", ... name="FGT-NewBranch", ... serial_number="FGVM02TM12345678", ... platform="FortiGate-60F", ... os_version="7.4" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
platformNoFortiGate-VM64
os_versionNo7.0
descriptionNo
serial_numberYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It describes the tool's purpose (adding a model device) but does not disclose behavioral traits like permissions needed, side effects, or that it does not add an actual device. The description is adequate but lacks depth.

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

Conciseness5/5

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

The description is well-structured: introductory sentence, conceptual explanation, then clear Args, Returns, and Example sections. Every part is useful and front-loaded.

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

Completeness4/5

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

Given the presence of an output schema (mentioned in context), the description still includes a helpful Returns section. It covers purpose, parameters, returns, and an example. Could mention prerequisites like ADOM existence, but otherwise complete.

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

Parameters5/5

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

Schema has 0% description coverage, but the description provides clear explanations for all 6 parameters in the Args section, including default values and an example serial number. This adds significant meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states 'Add a model device for offline provisioning' and explains that model devices allow pre-configuring policies and settings before the actual device connects. This distinguishes it from sibling tools like add_device (adds actual device) and add_devices_bulk.

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

Usage Guidelines3/5

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

The description mentions usefulness for zero-touch provisioning workflows but does not explicitly say when not to use this tool or compare it directly with alternatives like add_device. Usage context is implied but not fully explicit.

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

add_packet_captureA

Add a new FortiManager packet capture definition.

Creates a packet capture (sniffer) definition for traffic originating or destined to the FortiManager itself. The definition is created but not started -- call start_packet_capture() with the returned capture_id to begin capturing.

Args: interface: Interface to capture on (e.g. "port1") host: Filter by host address (optional, matches any host if unset) port: Filter by port or port range as a string, e.g. "80" or "1-1024" (optional) protocol: Filter by IP protocol number as a string, e.g. "6" for TCP (optional) vlan: Filter by VLAN ID as a string (optional) capture_ipv6: Include IPv6 traffic (default: False) capture_non_ip: Include non-IP traffic (default: False) max_packet_count: Maximum number of packets to capture (default: 4000, matching the FMG default)

Returns: dict: Create result with keys: - status: "success" or "error" - capture_id: ID of the created capture definition (FMG auto-assigns this) - message: Status or error message

Example: >>> result = await add_packet_capture(interface="port8", max_packet_count=300) >>> if result["status"] == "success": ... await start_packet_capture(result["capture_id"])

NameRequiredDescriptionDefault
hostNo
portNo
vlanNo
protocolNo
interfaceYes
capture_ipv6No
capture_non_ipNo
max_packet_countNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description still discloses that this is a two-phase operation (create does not start capture), that FMG auto-assigns the capture_id, and the filter semantics when optional args are omitted. It does not mention permissions, ADOM locking, capture resource consumption, or expiry, which are the remaining behavioral gaps for a mutating tool.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then Args/Returns/Example in a predictable layout. The doctest example is slightly long but earns its place by demonstrating the create-then-start chaining. Minor redundancy between Returns and the example's re-demonstration of the same keys.

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

Completeness5/5

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

For an 8-parameter creation tool with zero schema descriptions and no annotations, the definition covers purpose, all parameters, defaults, return shape, and the required follow-up call. An agent has everything needed to invoke it correctly and act on the result.

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

Parameters5/5

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

Schema coverage is 0%, so the description carries the full burden and does: every one of the 8 parameters is explained, including the crucial format details the schema lacks ('port' as a string like "80" or "1-1024", 'protocol' as a string IP protocol number, 'host' matches any host if unset). Defaults and the FMG-default max_packet_count of 4000 are also given.

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

Purpose5/5

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

The description states a specific verb and resource ('Add a new FortiManager packet capture definition') and scopes it precisely: traffic 'originating or destined to the FortiManager itself,' which separates it from the device-sniffer siblings like create_device_sniffer. An agent can pick the right tool without opening a schema.

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

Usage Guidelines4/5

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

It explicitly states the definition is created but not started and directs the agent to call start_packet_capture() with the returned capture_id, which is exactly the confusing part of this workflow. It doesn't explicitly name when to prefer create_device_sniffer or create_device_on_demand_sniffer, so the sibling routing is implied rather than spelled out.

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

assign_packageA

Assign a policy package to devices.

Associates a policy package with specific devices/VDOMs. The package can then be installed to these devices.

Args: adom: ADOM name package: Package name devices: Target devices [{"name": "FGT1", "vdom": "root"}, ...]

Returns: dict: Assignment result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await assign_package( ... adom="root", ... package="Branch-Policy", ... devices=[ ... {"name": "FGT-Branch1", "vdom": "root"}, ... {"name": "FGT-Branch2", "vdom": "root"} ... ] ... )

NameRequiredDescriptionDefault
adomYes
devicesYes
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Basic behavioral info: associates package with devices for later installation. Does not disclose side effects, permissions, or safety profile. No annotations exist, so description carries the burden but provides limited detail.

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

Conciseness5/5

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

Concise and well-structured: brief statement, then Args, Returns, and Example. No redundant information, every sentence adds value.

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

Completeness4/5

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

Covers purpose, parameters, return values, and example. However, lacks details on prerequisites (e.g., existence of ADOM/package/devices) and does not clarify synchronous/asynchronous behavior. Output schema is described in Returns.

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

Parameters4/5

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

While schema coverage is 0%, the description adds meaning by listing and describing each parameter (adom, package, devices with format example), compensating for the lack of schema descriptions.

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

Purpose5/5

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

The description clearly states 'Assign a policy package to devices.' with specific verb and resource, distinguishing it from sibling tools like assign_sdwan_template or assign_system_template.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. It lacks context on prerequisites, when not to use, or comparison with similar assign tools.

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

assign_sdwan_templateC

Assign an SD-WAN template to a device.

Args: adom: ADOM name template: SD-WAN template name device: Device name to assign vdom: VDOM name (default: root)

Returns: Assignment result

NameRequiredDescriptionDefault
adomYes
vdomNoroot
deviceYes
templateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, and the description does not disclose behavioral traits such as whether existing assignments are overwritten, the impact on device state, or required permissions. The return type 'Assignment result' is vague and lacks detail.

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

Conciseness4/5

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

The description is short and front-loads the purpose. The Args and Returns sections are clear and structured efficiently, with no unnecessary words.

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

Completeness2/5

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

For a mutation tool with no annotations, the description lacks completeness. It does not cover error conditions, side effects, prerequisites, or the format of the return value. The agent has insufficient context to use the tool safely.

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

Parameters3/5

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

With 0% schema description coverage, the description adds value by listing parameters and stating the default value for 'vdom'. However, it does not explain the meaning of each parameter (e.g., what ADOM is) or provide format constraints beyond names.

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

Purpose4/5

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

The description clearly states the verb 'Assign' and resource 'SD-WAN template to a device', distinguishing it from bulk and system template assignments. However, it does not explicitly mention that it assigns to a single device, which is implied by the name and bulk sibling.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like assign_sdwan_template_bulk, assign_system_template, or assign_template_group. No prerequisites or preconditions are mentioned, leaving the agent to infer usage context.

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

assign_sdwan_template_bulkA

Assign an SD-WAN template to multiple devices.

Args: adom: ADOM name template: SD-WAN template name devices: List of devices [{"name": "dev1", "vdom": "root"}, ...]

Returns: dict: Assignment result with keys: - success: True - requested_count: Number of devices in the request. NOT a count of assignments actually made: FortiManager reports no per-device result for this scope-member ADD, and the client raises on any non-zero code, so everything reaching this line is a code 0 that says nothing about individual devices (same shape as #78's device-group bulk tools). - result: Raw client result

NameRequiredDescriptionDefault
adomYes
devicesYes
templateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

With zero annotations, the description carries the full behavioral burden, and it delivers the single most important caveat: 'requested_count' is not a count of successful assignments, because FortiManager returns no per-device result for this scope-member ADD and the client raises on any non-zero code. That is a real behavioral disclosure an agent cannot get from the schema. It stops short of other mutation risks — whether reassignment overwrites an existing template, whether failures are partial, or whether a commit_adom is required afterward.

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

Conciseness4/5

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

Front-loaded with a single clear purpose sentence, followed by compact Args and a focused Returns caveat. The one blemish is the internal reference '(same shape as #78's device-group bulk tools)', which is noise for an agent, though the caveat it annotates is worth the words.

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

Completeness3/5

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

An output schema exists, so the Returns block is partly redundant — though the requested_count warning adds meaning beyond it. What's missing for a bulk mutation tool with no annotations is operational context: overwrite/reassignment behavior, partial-failure semantics, and whether a subsequent commit_adom or install is needed for the assignment to take effect.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it mostly does: it glosses all three parameters and, critically, supplies the concrete element shape for devices — '[{"name": "dev1", "vdom": "root"}]' — which the bare schema (array of string-keyed objects) does not reveal. It omits whether vdom is optional, whether devices must already exist in the ADOM, and whether the template name must come from list_sdwan_templates.

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

Purpose4/5

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

States a specific verb, resource and scope: 'Assign an SD-WAN template to multiple devices.' The 'multiple devices' framing implicitly distinguishes it from the single-device sibling assign_sdwan_template, but the description never names that sibling or the unassign counterpart, so the differentiation is only inferable.

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

Usage Guidelines3/5

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

No explicit statement of when to use this versus assign_sdwan_template (single) or assign_system_template_bulk. Usage is implied by 'multiple devices' in the first line, but there are no preconditions, no exclusions, and nothing about ADOM lock or commit requirements that would guide an agent choosing among the assignment tools.

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

assign_system_templateB

Assign a system template to a device.

Args: adom: ADOM name template: System template name device: Device name to assign vdom: VDOM name (default: root)

Returns: Assignment result

NameRequiredDescriptionDefault
adomYes
vdomNoroot
deviceYes
templateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior1/5

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

No annotations are present, so the description must fully disclose behavioral traits. It only states the action without mentioning side effects (e.g., overwriting existing assignments), authorization requirements, whether the operation is synchronous, or error handling. This severely limits an agent's ability to predict the tool's behavior.

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

Conciseness5/5

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

The description is extremely concise: one sentence for purpose, followed by a compact parameter list, and a one-line return statement. It is front-loaded and contains no superfluous information, making it easy for an agent to parse quickly.

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

Completeness2/5

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

Despite having an output schema (context signal), the description only states 'Returns: Assignment result' without specifying the structure (e.g., success flag, task ID, error details). The tool has 4 parameters and no enums, but the description lacks behavioral context (e.g., prerequisites, effects on device state). An agent would need additional information to use this tool reliably in a workflow.

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

Parameters4/5

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

The 'Args' section adds meaningful descriptions beyond the input schema's titles (e.g., 'ADOM name', 'System template name', 'Device name to assign', 'VDOM name (default: root)'). With schema description coverage at 0%, this compensation is effective, though some parameters (like adom) could benefit from more precise context (e.g., which ADOM scope applies).

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

Purpose5/5

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

The description clearly states the tool's action: 'Assign a system template to a device.' This specific verb+resource pairing distinguishes it from sibling tools like assign_sdwan_template and assign_system_template_bulk, which handle different template types or bulk operations.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., assign_system_template_bulk for multiple devices, assign_template_group for group assignments). An agent would have to infer context from the parameter list, which is insufficient for informed selection.

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

assign_system_template_bulkA

Assign a system template to multiple devices.

Args: adom: ADOM name template: System template name devices: List of devices [{"name": "dev1", "vdom": "root"}, ...]

Returns: dict: Assignment result with keys: - success: True - requested_count: Number of devices in the request. NOT a count of assignments actually made: FortiManager reports no per-device result for this scope-member ADD, and the client raises on any non-zero code, so everything reaching this line is a code 0 that says nothing about individual devices (same shape as #78's device-group bulk tools). - result: Raw client result

NameRequiredDescriptionDefault
adomYes
devicesYes
templateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it delivers the single most important behavioral fact: success=True is not a per-device success count, FortiManager returns no per-device result for this scope-member ADD, and the client raises on any non-zero code. That is a genuine partial-failure disclosure an agent could not infer elsewhere. It still omits lock requirements, overwrite behavior for devices already bound to another template, and idempotency.

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

Conciseness3/5

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

The purpose is front-loaded in one clean sentence, but the Returns block is a docstring dump that partly restates the output schema and includes an internal artifact reference ('same shape as #78's device-group bulk tools') that costs tokens without helping an agent. The core caveat inside it is worth keeping; the packaging is not.

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

Completeness3/5

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

For an unannotated bulk mutation touching many devices, the description covers the success-semantics trap well but leaves out acquisition of an ADOM lock, whether existing assignments are replaced, and what happens to other devices if one fails. Adequate to call correctly, thin on consequences.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does for the hardest parameter: the devices array is shown with its key structure and a concrete example ({"name": "dev1", "vdom": "root"}), which the schema entirely lacks given its bare additionalProperties:string items. 'adom: ADOM name' and 'template: System template name' add little beyond the field names, keeping it below 5.

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

Purpose4/5

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

The opening sentence states a specific verb and resource plus the bulk scope ('Assign a system template to multiple devices'), which implicitly separates it from the singular assign_system_template and from assign_sdwan_template_bulk. It never names the sibling alternative explicitly, so the differentiation is inferable rather than stated.

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

Usage Guidelines3/5

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

Usage is only implied through the word 'multiple' -- an agent can guess that assign_system_template is the single-device path, but the description never says so, nor does it state prerequisites such as needing the ADOM unlocked or the template to already exist. No when-not guidance at all.

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

assign_template_groupC

Assign a template group to a device.

Args: adom: ADOM name template_group: Template group name device: Device name vdom: VDOM name (default: root)

Returns: Assignment result

NameRequiredDescriptionDefault
adomYes
vdomNoroot
deviceYes
template_groupYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the description must fully convey behavioral traits. It states only that the tool 'assigns', which implies a create/update operation, but does not disclose idempotency, destructiveness, locking requirements, or whether the assignment replaces existing ones. This is insufficient for safe invocation.

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

Conciseness4/5

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

The description is concise with a clear structure: one-line purpose, a bullet-like list of arguments, and a returns line. No extraneous information, though the returns line adds minimal value.

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

Completeness2/5

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

Given 4 parameters, no annotations, and a sparse description, the tool definition lacks completeness. It does not explain error conditions, required object existence (e.g., template_group must exist), or ADOM context. The returns line is vague. An agent would struggle to use this tool reliably without additional documentation.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must add meaning beyond parameter names. It merely lists the parameter names (adom, template_group, device, vdom) without explaining their roles or constraints. The schema already provides these names, so no added value.

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

Purpose4/5

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

The description clearly states the action ('assign') and the resource ('template group to a device'), making the core purpose understandable. However, it does not differentiate from sibling tools like assign_package or assign_system_template, which share the same verb-resource pattern.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives (e.g., assign_package for provisioning templates). There are no prerequisites, context, or exclusions mentioned, leaving the agent without decision support.

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

assign_vap_to_wtp_profileA

Add a VAP (SSID) to a FortiAP profile's radios so it gets broadcast.

Reads the profile, appends the VAP to each selected radio's manual VAP list, and switches that radio's vap-all mode to "manual" (the mode that honors an explicit list). VAPs already present are left in place.

Args: device: Managed device name profile: FortiAP (WTP) profile name vap: VAP object name to broadcast radios: Radios to add the SSID to, from 1-3 (default [1, 2]) vdom: VDOM the profile lives in (default "root")

Returns: Update result listing the radios changed

NameRequiredDescriptionDefault
vapYes
vdomNoroot
deviceYes
radiosNo
profileYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that the profile is read, the VAP is appended, vap-all is switched to manual, and existing VAPs are preserved. It does not mention permissions, rate limits, or whether a commit/install is required afterward.

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

Conciseness5/5

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

The description is front-loaded with the core effect, then structured into Args and Returns. Every sentence adds useful information about behavior or parameters, with no wasted text.

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

Completeness4/5

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

The definition is strong for a mutation tool with no annotations: it explains the side effects, idempotent handling of existing VAPs, parameters, and return result. It is only missing workflow context such as whether changes must be committed/installed or what permissions are required.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does: every parameter is explained, including device, profile, VAP name, radios with the 1-3 range and default, and VDOM with its default. The only minor tension is that the schema shows radios default null while the description says default [1, 2].

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

Purpose4/5

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

States a specific verb and resource: add a VAP/SSID to a FortiAP profile's radios so it is broadcast. It is clearly distinguishable from nearby CRUD tools, though it does not explicitly name alternatives such as update_device_wtp_profile_radio.

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

Usage Guidelines3/5

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

The description explains the effect of using the tool (appending the VAP and switching vap-all to manual), which implies when it is appropriate. However, it does not state when to use this versus alternatives like update_device_wtp_profile_radio or create_device_vap, nor does it give any exclusions.

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

clone_packageA

Clone a policy package.

Creates a copy of an existing package with all its policies.

Args: adom: ADOM name package: Source package name new_name: Name for the cloned package

Returns: dict: Clone result with keys: - status: "success" or "error" - package: New package name - message: Status or error message

Example: >>> result = await clone_package( ... adom="root", ... package="default", ... new_name="default-copy" ... )

NameRequiredDescriptionDefault
adomYes
packageYes
new_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of behavioral transparency. It states 'Creates a copy' indicating a write operation, but it does not disclose important behaviors such as whether existing packages with the same name are overwritten, if the operation is idempotent, or any required permissions. The return format is described, but side effects are understated.

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

Conciseness4/5

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

The description is reasonably concise and well-structured with a clear docstring format (Args, Returns, Example). It includes only necessary information without redundancy. However, the example is a bit lengthy but adds value, so not penalized heavily.

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

Completeness4/5

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

Given the tool's simplicity and the presence of an output schema in the description, the context is fairly complete. It covers the function, all parameters, return structure, and an example. It could improve by mentioning preconditions (e.g., the source package must exist) or error behavior, but overall it is adequate.

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

Parameters4/5

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

The input schema has 0% description coverage, so the description's parameter details ('adom: ADOM name', 'package: Source package name', 'new_name: Name for the cloned package') add essential meaning beyond the schema. While concise, these descriptions compensate for the lack of schema annotations, meeting the baseline expectation for 0% coverage.

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

Purpose5/5

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

The description clearly states 'Clone a policy package. Creates a copy of an existing package with all its policies.' It uses a specific verb ('clone') and resource ('policy package'), and it distinguishes from siblings like create_package or delete_package by specifying that it duplicates an existing package.

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

Usage Guidelines3/5

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

The description implies when to use this tool (when you want to duplicate a package), but it does not explicitly state when not to use it or mention alternatives such as create_package. No guidance on prerequisites or comparisons is provided, so usage guidance is only implied.

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

commit_adomA

Commit changes to an ADOM (workspace mode).

Saves all pending changes made to the ADOM. Must be called before unlocking to persist changes.

Args: adom: ADOM name to commit

Returns: dict: Commit result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden for behavioral disclosure. It states that commits persist pending changes and is required before unlock, which is essential for a commit tool. However, it does not mention side effects, permissions, idempotency, or error handling.

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

Conciseness5/5

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

The description is extremely concise, with a single-sentence functional description, a critical usage note, and clearly separated args/returns sections. Every sentence adds value with no wasted words.

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

Completeness4/5

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

For a simple commit tool with one parameter and an output schema, the description covers the essential purpose, usage timing, and return format. It could mention error conditions or prerequisites, but is largely complete given the tool's simplicity.

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

Parameters3/5

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

The schema description coverage is 0%, so the description must compensate. It describes the single parameter 'adom: ADOM name to commit', which adds minimal context beyond the schema property name and type. It does not provide format, constraints, or examples.

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

Purpose5/5

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

The description clearly states 'Commit changes to an ADOM' using a specific verb and resource, and explicitly mentions 'Saves all pending changes made to the ADOM.' It also distinguishes from sibling tools like lock_adom and unlock_adom by specifying the required order of operations ('Must be called before unlocking to persist changes').

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

Usage Guidelines4/5

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

The description provides clear guidance on when to use the tool: 'Must be called before unlocking to persist changes.' It implies usage after making changes and before unlocking, but does not explicitly exclude other scenarios or mention alternatives.

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

create_address_fqdnA

Create an FQDN (Fully Qualified Domain Name) address object.

FQDN addresses are resolved dynamically by FortiGate.

Args: adom: ADOM name name: Address object name fqdn: Domain name (e.g., "www.example.com") comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created address name - message: Status or error message

Example: >>> result = await create_address_fqdn( ... adom="root", ... name="Google-DNS", ... fqdn="dns.google.com" ... )

NameRequiredDescriptionDefault
adomYes
fqdnYes
nameYes
commentNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that FQDN addresses are resolved dynamically, which is a key behavioral trait. However, it omits details on permissions, side effects, or return value behavior beyond the schema.

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

Conciseness5/5

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

The description is well-organized with a docstring structure: summary, behavioral note, Args, Returns, and Example. Every sentence adds value, and it is appropriately sized with no wasted words.

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

Completeness4/5

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

The tool has an output schema, and the description includes the return structure. It also mentions dynamic resolution behavior. For a create function, this covers essential context, though error handling and prerequisites are not addressed.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It lists all parameters with brief explanations, e.g., fqdn: 'Domain name (e.g., "www.example.com")'. This adds meaningful context beyond the raw schema property types.

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

Purpose5/5

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

The description clearly states the action ('Create an FQDN ... address object') and the resource (FQDN address object). Among siblings like create_address_host and create_address_subnet, it uniquely identifies its focus on fully qualified domain names.

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

Usage Guidelines4/5

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

The description notes that FQDN addresses are resolved dynamically, which guides when to use this tool. It provides a concrete example but does not explicitly contrast with alternatives or list when not to use it.

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

create_address_groupA

Create an address group.

Args: adom: ADOM name name: Group name members: List of address object names to include comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created group name - message: Status or error message

Example: >>> result = await create_address_group( ... adom="root", ... name="Web-Servers", ... members=["WebServer1", "WebServer2", "WebServer3"], ... comment="Production web servers" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
membersYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description fully explains what the tool does: creates an address group, lists parameters, and specifies the return format. It could mention idempotency or error cases, but overall behavior is clear.

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

Conciseness5/5

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

The description is well-structured with clear sections for purpose, args, returns, and an example. Every sentence adds value, and it is concise.

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

Completeness5/5

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

Given the tool's complexity and the presence of siblings, the description fully covers what an agent needs to know: input requirements, output format, and a usage example. It is complete.

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

Parameters5/5

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

With 0% schema description coverage, the description compensates by explaining each parameter (adom, name, members, comment) and provides a concrete example. This adds significant meaning beyond the schema.

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

Purpose5/5

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

The description clearly states 'Create an address group' and distinguishes it from siblings like create_address_fqdn or create_address_subnet by specifying it groups address objects. The example reinforces the purpose.

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

Usage Guidelines3/5

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

The description implies usage for creating address groups but does not explicitly state when to use this tool versus other address creation tools. No alternatives or exclusions are mentioned.

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

create_address_hostA

Create a host address object (single IP).

Args: adom: ADOM name name: Address object name ip: Host IP address (e.g., "10.0.0.100") comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created address name - message: Status or error message

Example: >>> result = await create_address_host( ... adom="root", ... name="WebServer", ... ip="192.168.1.100", ... comment="Production web server" ... )

NameRequiredDescriptionDefault
ipYes
adomYes
nameYes
commentNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not mention idempotency, side effects, authentication requirements, or what happens on duplicate IPs. The return format is described, but safety and mutability traits are missing.

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

Conciseness4/5

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

The description is structured with Args, Returns, and Example sections. It is longer than minimal but every part adds value: purpose, parameter explanations, return format, and a concrete example. No redundant sentences.

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

Completeness4/5

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

Given the tool has 4 parameters (3 required) and an output schema, the description covers parameters, provides an example, and describes the return value. It is complete for a creation tool, though behavioral context is missing. The presence of an output schema in context reduces the need to explain return values, but the description does it anyway.

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

Parameters4/5

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

Schema description coverage is 0%, but the description compensates by explaining each parameter: adom (ADOM name), name (object name), ip (with example), comment (optional). The return schema is also described in text. This adds significant meaning beyond the bare schema.

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

Purpose5/5

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

The description explicitly states 'Create a host address object (single IP)', providing a specific verb and resource. The tool name includes 'address_host', and the description clarifies it's for single IP addresses, distinguishing it from siblings like create_address_fqdn or create_address_range.

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

Usage Guidelines3/5

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

The description does not explicitly mention when to use this tool over alternatives. While the purpose 'single IP' implies the use case, there is no guidance on when not to use it or comparison with other address creation tools. The example provides context but not explicit usage rules.

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

create_address_rangeA

Create an IP range address object.

Args: adom: ADOM name name: Address object name start_ip: Start IP address end_ip: End IP address comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created address name - message: Status or error message

Example: >>> result = await create_address_range( ... adom="root", ... name="DHCP-Pool", ... start_ip="192.168.1.100", ... end_ip="192.168.1.200" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
end_ipYes
commentNo
start_ipYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It describes creation, required parameters, and return format, but lacks details on idempotency, duplicate handling, or side effects.

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

Conciseness5/5

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

The description is well-structured with Args, Returns, and Example sections. It is concise and front-loaded with the main purpose, earning its place without waste.

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

Completeness4/5

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

Given the tool's complexity (5 parameters, output schema), the description covers inputs and outputs well. It lacks prerequisites (e.g., ADOM existence) but is largely complete for a creation tool.

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

Parameters5/5

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

Schema description coverage is 0%, but the description provides clear explanations for all parameters (adom, name, start_ip, end_ip, comment) and includes an example, adding significant meaning beyond the schema.

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

Purpose5/5

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

The description clearly states 'Create an IP range address object.' and distinguishes from siblings like create_address_fqdn, create_address_host, etc., which are listed among sibling tools.

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

Usage Guidelines3/5

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

The description explains what the tool does but does not provide explicit guidance on when to use it vs. alternatives (e.g., create_address_host). Usage context is implied but not stated.

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

create_address_subnetA

Create a subnet/network address object.

Args: adom: ADOM name name: Address object name subnet: IP/netmask (e.g., "10.0.0.0/24" or "10.0.0.0 255.255.255.0") comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created address name - message: Status or error message

Example: >>> result = await create_address_subnet( ... adom="root", ... name="LAN-Subnet", ... subnet="192.168.1.0/24", ... comment="Local network" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
subnetYes
commentNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the creation action and return format, without addressing potential side effects, permissions, or constraints (e.g., handling duplicates, overwrite behavior). This is minimal transparency for a mutation tool.

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

Conciseness4/5

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

The description is well-structured as a docstring with clear sections (Args, Returns, Example). It is comprehensive without being verbose, though the opening line could be slightly more concise. Every sentence adds value.

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

Completeness4/5

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

Given the tool's simplicity (4 parameters, output schema defined), the description provides a complete picture: what it does, required inputs, acceptable formats, and expected return values. It lacks edge-case behavior (e.g., duplicate handling) but is sufficient for standard use.

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

Parameters5/5

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

The schema has 0% coverage (no descriptions), but the description compensates fully by explaining each parameter: adom, name, subnet (with example formats), and comment (optional). This adds significant meaning beyond the schema's bare titles.

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

Purpose5/5

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

The description explicitly states 'Create a subnet/network address object,' using a specific verb+resource. Among sibling tools like create_address_fqdn, create_address_host, etc., it clearly distinguishes this tool as specializing in subnet addresses.

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

Usage Guidelines3/5

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

The description implies usage for creating subnet addresses by specifying the subnet parameter format (CIDR or netmask). However, it does not provide explicit guidance on when to use this tool versus alternatives (e.g., for FQDN or host addresses), nor does it mention when not to use it.

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

create_antivirus_profileA

Create an antivirus profile.

Args: adom: ADOM name name: Profile name comment: Optional comment feature_set: Flow/proxy feature set - "proxy" or "flow" (optional) scan_mode: Scan mode - "default" or "legacy" (optional) av_virus_log: Enable/disable AntiVirus logging - "enable" or "disable" (optional)

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created profile name - message: Status or error message

Example: >>> result = await create_antivirus_profile( ... adom="root", ... name="strict-av", ... feature_set="flow", ... av_virus_log="enable", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
scan_modeNo
feature_setNo
av_virus_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It does not disclose permissions, side effects, duplicate-name handling, ADOM lock requirements, or whether a subsequent commit is needed; it mainly restates the mutation and return shape already implied by the name and output schema.

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

Conciseness4/5

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

The description is front-loaded with the purpose and then structured into Args, Returns, and Example sections. It is somewhat verbose because the Returns section duplicates output schema information, but the parameter documentation is necessary given 0% schema coverage.

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

Completeness4/5

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

For a six-parameter create tool with no annotations and no schema descriptions, the description provides all parameter meanings and an example call. It is incomplete on behavioral and usage context, especially mutation prerequisites, but sufficient to invoke the tool correctly.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates by explaining every parameter, including allowed values for feature_set ("proxy" or "flow"), scan_mode ("default" or "legacy"), and av_virus_log ("enable" or "disable"). This adds substantial meaning beyond the schema titles.

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

Purpose5/5

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

The description states a specific verb and resource: "Create an antivirus profile." This clearly distinguishes it from sibling operations such as update_antivirus_profile, get_antivirus_profile, delete_antivirus_profile, and list_antivirus_profiles.

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

Usage Guidelines3/5

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

Usage is implied by the create verb and the example invocation, but there is no explicit guidance on when to use this versus update_antivirus_profile, prerequisites such as ADOM locking, or whether a commit is required afterward. It gives enough context to attempt the call, but not full routing guidance.

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

create_application_listB

Create an application-control list.

Args: adom: ADOM name name: List name comment: Optional comment deep_app_inspection: Enable/disable deep application inspection - "enable" or "disable" (optional) unknown_application_action: Pass or block traffic from unknown applications - "pass" or "block" (optional) other_application_action: Action for other applications - "pass" or "block" (optional)

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created list name - message: Status or error message

Example: >>> result = await create_application_list( ... adom="root", ... name="strict-appctrl", ... unknown_application_action="block", ... other_application_action="block", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
deep_app_inspectionNo
other_application_actionNo
unknown_application_actionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses return keys and allowed values for optional flags, but does not mention permissions, whether a commit is required afterward, duplicate-name handling, or other mutation-specific side effects.

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

Conciseness4/5

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

The description is front-loaded with the purpose and uses a clean Args/Returns/Example structure. It is somewhat verbose because the Returns section duplicates output information, but the example earns its place by showing a realistic invocation.

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

Completeness3/5

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

The description covers all parameters, return keys, and an example, which is enough for basic invocation. However, for a mutation tool with no annotations, it omits lifecycle context such as commit requirements, permission needs, and behavior on duplicate list names.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It names all six parameters and adds meaningful semantics, especially allowed values such as "enable"/"disable" and "pass"/"block" for the optional fields.

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

Purpose4/5

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

The description states a specific verb and resource: "Create an application-control list." This clearly distinguishes it from sibling read/update/delete operations, though it does not explicitly name those alternatives.

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

Usage Guidelines2/5

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

The description does not explain when to create a new list versus using update_application_list or deleting an existing one. The example shows how to invoke it, but provides no selection guidance, prerequisites, or exclusions.

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

create_cli_template_groupB

Create a new CLI template group.

Args: adom: ADOM name name: CLI template group name description: Optional description

Returns: Created CLI template group

NameRequiredDescriptionDefault
adomYes
nameYes
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

No annotations provided, so description carries full burden. It states 'create' (write operation) and 'Returns: Created CLI template group', but does not disclose potential side effects, error handling, or whether the operation is idempotent. Limited transparency for a mutable action.

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

Conciseness4/5

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

Description is very short and frontloaded with the purpose. The use of 'Args:' and 'Returns:' provides a clean structure. However, it could be slightly more structured (e.g., bullet points) but is already efficient.

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

Completeness3/5

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

Simple creation tool with output schema available, so description covers basic purpose and parameters. However, it lacks context about prerequisites (e.g., does the ADOM need to exist?) and behavior on conflicts. Adequate but not complete.

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

Parameters3/5

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

Schema coverage is 0%, and the description provides basic mappings for each parameter (e.g., 'adom: ADOM name'). This adds some meaning beyond the raw schema, but lacks examples, constraints, or context about valid values, making it minimally helpful.

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

Purpose5/5

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

The description clearly states 'Create a new CLI template group' with a specific verb and resource. The name itself distinguishes it from sibling create tools for other entities like packages or scripts, making purpose unambiguous.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives. The name implies its purpose, but there is no mention of prerequisites or exclusions. Usage is implied but not elaborated.

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

create_device_dhcp_serverA

Create a DHCP server scope in a device's device DB.

Args: device: Managed device name interface: Interface the scope serves (e.g. "vlan15") start_ip: First address of the lease range end_ip: Last address of the lease range netmask: Scope netmask (e.g. "255.255.255.0") default_gateway: Gateway handed to clients (defaults to the interface address if omitted, per FortiOS behavior) dns_servers: Up to three DNS servers to hand out; omitted means the device's system DNS is used (dns-service default) lease_time: Lease time in seconds vdom: VDOM the scope lives in (default "root")

Returns: Creation result including the new scope id

NameRequiredDescriptionDefault
vdomNoroot
deviceYes
end_ipYes
netmaskYes
start_ipYes
interfaceYes
lease_timeNo
dns_serversNo
default_gatewayNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses FortiOS defaulting behavior for default_gateway (interface address), dns_servers (system dns-service), and vdom ('root'), which the schema cannot convey. However it does not say whether the change is staged in the device DB and requires commit_adom/install to take effect, whether re-creating an overlapping scope errors, or what permissions are required.

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

Conciseness4/5

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

Purpose is front-loaded in one sentence, then a scannable args list where each line earns its place. The Returns line is slightly redundant given an output schema exists, and the wrapped default_gateway/dns_servers lines are a bit verbose, but nothing is filler.

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

Completeness4/5

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

For a 9-parameter mutation tool with no annotations, the description covers purpose, all parameters, defaults, and return shape (with an output schema backing it). The remaining gap is deployment semantics — whether a commit/install step is needed for the scope to become active — which matters for a device DB write.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must do all the work, and it does: every one of the 9 parameters is explained with meaning, an example value ('vlan15', '255.255.255.0'), a cardinality limit (up to three DNS servers), a unit (lease time in seconds), and defaults. This is substantially more than the bare titles in the schema.

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

Purpose4/5

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

The opening line gives a specific verb+resource+scope: 'Create a DHCP server scope in a device's device DB.' That distinguishes it from the many other create_* siblings (interfaces, VAPs, IPsec phases). It stops short of naming the sibling it complements (update_device_dhcp_server / list_device_dhcp_servers) or the precondition that the device already be managed.

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

Usage Guidelines3/5

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

Usage is implied by the verb and the parameter set, and one behavioral hint is given for default_gateway ('per FortiOS behavior'). But there is no explicit when-to-use/when-not, no statement of prerequisites (device must exist in the ADOM/VDOM), and no mention of the list_device_dhcp_servers alternative for checking existing scopes.

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

create_device_groupA

Create a device group in FortiManager's device manager database.

Device groups organize managed devices (and other groups) for bulk operations like policy installation. This is a dvmdb object -- creation does not touch any live device.

Args: adom: ADOM name where the group will be created name: Group name (dvmdb group.name, master key) os_type: Device platform family the group targets (default: "unknown"). One of: unknown, fos, fsw, foc, fml, faz, fwb, fch, fct, log, fmg, fsa, fdd, fac, fpx, fna, ffw, fsr, fad, fdc, fap, fxt, fts, fai, fwc, fis, fed, fpa, fca, ftc, fss, fra, sim, fdt. description: Optional group description

Returns: dict: Create result with keys: - status: "success" or "error" - group: Created group name/adom - message: Status or error message

Example: >>> result = await create_device_group( ... adom="root", ... name="Branch-Firewalls", ... os_type="fos", ... description="All branch FortiGates", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
os_typeNounknown
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations exist, so the description carries the full load; it does well to disclose that this writes only to the dvmdb and doesn't touch live devices, plus the default os_type='unknown'. It omits risks an agent needs: behavior when the group name already exists, whether an ADOM lock is required (lock_adom is a sibling), and permission requirements.

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

Conciseness4/5

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

Front-loaded with the purpose and safety scope, then systematically covers args, returns, and an example. The long os_type enumeration is bulky but earns its place because the schema declares no enum; the Returns block is mildly redundant given an output schema exists.

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

Completeness4/5

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

For a 4-parameter mutation tool with no annotations, it supplies purpose, scope, all parameter semantics, return shape, and a worked example. The remaining gap is edge-case behavior (duplicate name handling, ADOM lock expectations) which an agent would want before calling.

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

Parameters5/5

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

Schema description coverage is 0%, yet the description defines all four parameters, including the meaning of adom and name as the group master key, the default for os_type, and the full 33-value os_type enumeration that is absent from the schema. That is meaningful compensation well beyond the structured fields.

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

Purpose5/5

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

Opens with a specific verb+resource ('Create a device group in FortiManager's device manager database') and immediately scopes it as a dvmdb metadata object that does not touch live devices. That scope statement separates it from siblings like add_device_to_group or execute_script_on_device_group without the agent opening a schema.

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

Usage Guidelines3/5

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

It gives context for why groups exist ('bulk operations like policy installation') and clarifies the operation is metadata-only, which implies when to reach for it. However, it never names the complementary siblings (add_device_to_group, add_group_to_group, add_devices_to_group_bulk) or states prerequisites, so the agent must infer the boundary between creating a group and populating one.

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

create_device_interfaceA

Create a VLAN subinterface in a device's device DB.

Reads back with get_device_interface_config; push to the FortiGate with preview_install + install_device_settings.

Args: device: Managed device name name: New interface name (e.g. "vlan15") parent: Physical/aggregate parent interface (e.g. "internal") vlanid: VLAN id (1-4094) ip: Interface address, CIDR ("192.0.2.254/24") or "address netmask" allowaccess: Administrative access to allow (e.g. ["ping", "https"]) role: Interface role: lan, wan, dmz or undefined alias: Short alias shown in the GUI vdom: VDOM the interface belongs to (default "root") description: Interface description

Returns: Creation result

NameRequiredDescriptionDefault
ipNo
nameYes
roleNo
vdomNoroot
aliasNo
deviceYes
parentYes
vlanidYes
allowaccessNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the most important non-obvious behavior: the change lands in the device DB and requires a separate preview/install push to reach the FortiGate. It omits secondary traits: whether an ADOM lock is needed, whether duplicate names or vlanids error, idempotency, and permission requirements.

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

Conciseness4/5

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

Front-loaded with the core action and workflow routing, then a clean Args/Returns block proportionate to ten parameters. The only waste is 'Returns: Creation result,' which adds nothing given an output schema exists.

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

Completeness4/5

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

For a ten-parameter mutation tool with zero annotation coverage, the description covers action, staging-vs-live semantics, follow-up calls, and every parameter's format. An output schema means return values need no prose. Remaining gap is operational preconditions (ADOM lock, permissions, duplicate handling) that an agent would otherwise have to discover by failing.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates with an Args block that documents all ten parameters, including formats the schema does not encode: vlanid range 1-4094, ip as CIDR or 'address netmask', a concrete allowaccess example, and the role value set lan/wan/dmz/undefined.

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

Purpose5/5

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

States a specific verb, resource, and scope: create a VLAN subinterface in a device's device DB. The 'VLAN subinterface' qualifier narrows it usefully against siblings like create_device_vap, update_device_interface, and delete_device_interface, and the same sentence establishes that this writes to the staging DB rather than the live FortiGate.

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

Usage Guidelines4/5

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

Explicitly places the tool in a workflow chain: read back with get_device_interface_config, then push with preview_install + install_device_settings. That tells an agent both what to do next and that this call alone does not reach the device. It stops short of naming exclusions, e.g. that modifying an existing interface requires update_device_interface rather than this create.

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

create_device_ipsec_phase1_interfaceA

Create an IPsec phase1-interface (remote gateway / IKE SA) in a device's device DB.

Route-based (interface-mode) tunnel only -- this always writes an interface (the outgoing local interface), matching the phase1-interface table this tool targets rather than the legacy policy-based phase1 table.

Args: device: Managed device name name: New phase1-interface (remote gateway) name interface: Local physical/aggregate/loopback/VLAN outgoing interface type: Remote gateway type: "static", "dynamic" or "ddns"; default "static" remote_gw: Remote gateway's external IPv4 address. Required when type is "static" -- a static gateway with no address cannot connect psksecret: Pre-shared key for PSK authentication, 6-128 characters ike_version: IKE protocol version, "1" or "2" mode: IKEv1 ID protection mode: "main" or "aggressive" (ignored on IKEv2) peertype: Peer ID acceptance: "any", "one", "dialup", "peer" or "peergrp". Defaults to "any" when type is "static" and no value is given -- live-verified against FMG 7.6.7: a static PSK gateway created without peertype is rejected with "peer invalid value", so this tool supplies the working default rather than surfacing that error to the caller proposal: Phase1 encryption/authentication proposal list (e.g. ["aes256-sha256"]). Values are passed through to FortiManager largely unvalidated -- see module docstring dhgrp: Phase1 Diffie-Hellman group list (e.g. ["14", "21"]). Same pass-through as proposal nattraversal: NAT traversal: "disable", "enable" or "forced" dpd: Dead Peer Detection mode: "disable", "on-idle" or "on-demand" keylife: Phase1 key life in seconds comments: Free-text comment vdom: VDOM the gateway lives in (default "root")

Returns: Creation result with any echoed credential stripped

NameRequiredDescriptionDefault
dpdNo
modeNo
nameYes
typeNostatic
vdomNoroot
dhgrpNo
deviceYes
keylifeNo
commentsNo
peertypeNo
proposalNo
interfaceYes
psksecretNo
remote_gwNo
ike_versionNo
nattraversalNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the load and does so well: it discloses that this is a write into the device DB, that the peertype default is a live-verified workaround for an FMG 7.6.7 'peer invalid value' rejection, that proposal/dhgrp are passed through largely unvalidated, and that echoed credentials are stripped from the result. It does not mention ADOM locking or that a commit/install is required for the change to take effect.

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

Conciseness4/5

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

The opening sentence front-loads purpose and scope before the argument list, and the Args block is scannable with no filler entries. The peertype paragraph is longer than strictly needed and could be compressed, but the extra length buys real behavioral information rather than repetition.

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

Completeness4/5

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

For a 16-parameter mutation tool with zero schema descriptions, the description supplies the enum values, defaults, conditional requirements and validation caveats an agent needs to construct a valid call. Return values need not be explained since an output schema exists. The missing piece is lifecycle context — ADOM lock/commit expectations after creating the object.

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

Parameters5/5

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

Schema coverage is 0%, yet the description documents essentially every one of the 16 parameters: enumerations for type, ike_version, mode, peertype, nattraversal, dpd; the 6-128 character constraint on psksecret; the conditional requirement that remote_gw be set when type is static; and the note that mode is ignored on IKEv2. This more than compensates for the empty schema descriptions.

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

Purpose5/5

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

States a specific verb and resource ('Create an IPsec phase1-interface (remote gateway / IKE SA) in a device's device DB') and explicitly disambiguates from the legacy policy-based 'phase1' table, which is exactly the confusion an agent would have. It also situates the object relative to the sibling phase2-interface tools.

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

Usage Guidelines4/5

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

The scope constraint 'Route-based (interface-mode) tunnel only' tells the agent when this tool is the right choice versus the legacy policy-based path, and the 'interface' arg is defined as the outgoing local interface. There is no explicit pointer to follow-up calls (e.g. creating the phase2 child or committing the ADOM), so it stops just short of full when/how guidance.

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

create_device_ipsec_phase2_interfaceA

Create an IPsec phase2-interface (tunnel/traffic selector) in a device's device DB.

Args: device: Managed device name name: New phase2-interface (tunnel) name phase1name: Parent phase1-interface (remote gateway) name this tunnel is negotiated under src_subnet: Local proxy ID subnet, CIDR ("192.168.1.0/24") or "address netmask" form. Omitted means the FortiOS default (0.0.0.0/0, the whole local network) dst_subnet: Remote proxy ID subnet, same accepted forms. Omitted means the FortiOS default (0.0.0.0/0) proposal: Phase2 encryption/authentication proposal list (e.g. ["aes256-sha256"]). Pass-through, see module docstring dhgrp: Phase2 PFS Diffie-Hellman group list. Pass-through, see module docstring pfs: Perfect Forward Secrecy: "disable" or "enable" replay: Replay detection: "disable" or "enable" keepalive: Keep-alive: "disable" or "enable" auto_negotiate: IPsec SA auto-negotiation: "disable" or "enable" keylifeseconds: Phase2 key life in seconds (120-172800) comments: Free-text comment vdom: VDOM the tunnel lives in (default "root")

Returns: Creation result

NameRequiredDescriptionDefault
pfsNo
nameYes
vdomNoroot
dhgrpNo
deviceYes
replayNo
commentsNo
proposalNo
keepaliveNo
dst_subnetNo
phase1nameYes
src_subnetNo
auto_negotiateNo
keylifesecondsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden; it usefully discloses that omitting src_subnet/dst_subnet yields the FortiOS 0.0.0.0/0 default (a meaningful security gotcha) and that proposal/dhgrp are pass-through. But it says nothing about permissions, ADOM/device locking, commit requirements, duplicate-name handling, or idempotency for a mutation tool.

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

Conciseness4/5

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

Front-loaded one-sentence purpose followed by a well-structured arg list where each entry adds real information rather than restating the schema title. The trailing 'Returns: Creation result' is near-zero content and a small amount of trailing padding exists.

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

Completeness3/5

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

A 14-parameter write tool with zero annotation coverage and no output-schema burden on the description (an output schema exists, so return-value detail is rightly omitted). Given that this is a network-config mutation, the absence of lock/commit/permission/conflict behavior leaves the description short of complete.

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

Parameters4/5

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

Schema coverage is 0%, so the Args block does the heavy lifting and largely succeeds: accepted CIDR vs 'address netmask' forms with an example for src_subnet, allow/deny value sets for pfs/replay/keepalive/auto_negotiate, the 120-172800 range for keylifeseconds, and the 'root' default for vdom. The two deferred params ('pass-through, see module docstring' for proposal and dhgrp) remain unexplained since that docstring isn't available to the agent.

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

Purpose4/5

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

States a specific verb and resource with clarifying gloss ('IPsec phase2-interface (tunnel/traffic selector)') and scopes it to 'a device's device DB'. It implicitly separates from create_device_ipsec_phase1_interface by naming phase1name as the parent, though it never explicitly contrasts with update_/delete_ phase2 siblings.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: phase1name's description signals the phase1-interface must already exist as a prerequisite, and the omitted-parameter defaults tell the agent what happens when optional args are skipped. There is no explicit when-to-use versus update_device_ipsec_phase2_interface, nor any note on lock/commit prerequisites before the change takes effect.

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

create_device_on_demand_snifferA

Create a bounded on-demand packet sniffer on a managed device.

Distinct FortiOS object from create_device_sniffer's firewall sniffer: this one (firewall on-demand-sniffer) is name-keyed rather than id-keyed, and bounded by max_packet_count rather than running continuously -- closer to a one-shot capture job than a standing diagnostic rule. Filters are lists (multiple hosts/ports/ protocols at once), not the single range-string form the persistent sniffer uses.

How to actually trigger the capture and retrieve packets once this definition exists is not part of FortiOS's Configuration API (this tool only stages the definition, config-CRUD like every other tool in this module) -- that would be a separate monitor-API or CLI mechanism, out of scope here.

Args: device: Managed device name name: On-demand sniffer name interface: Interface name traffic sniffing takes place on max_packet_count: Maximum packets to capture (default: 4000) hosts: IPv4/IPv6 hosts to filter for ports: Ports to filter for (each 1-65535) protocols: IANA protocol numbers to filter for (each 0-255) capture_non_ip: Include non-IP packets (default: False) vdom: VDOM the sniffer lives in (default "root")

Returns: Creation result

NameRequiredDescriptionDefault
nameYes
vdomNoroot
hostsNo
portsNo
deviceYes
interfaceYes
protocolsNo
capture_non_ipNo
max_packet_countNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well by disclosing that this only stages the FortiOS configuration object and does not trigger or retrieve packets. It does not cover mutation edge cases such as duplicate names, permission requirements, or whether a commit is needed.

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

Conciseness4/5

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

The description is front-loaded with the core action and distinction from the sibling tool, then gives a useful scope caveat and parameter semantics. It is somewhat long, but the length is justified by the complex FortiOS distinction and the 0% schema description coverage.

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

Completeness5/5

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

Given the nine parameters, zero schema descriptions, and an output schema, the description provides everything needed to call the tool correctly. It explains all parameters, the tool's scope boundary, and its relationship to the persistent sniffer alternative.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate for all nine parameters. It provides meaningful semantics for each: device, name, interface, max_packet_count default, IPv4/IPv6 hosts, port range, IANA protocol range, capture_non_ip default, and vdom default.

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

Purpose5/5

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

The description states a specific verb and resource: creating a bounded on-demand packet sniffer on a managed device. It explicitly distinguishes this from create_device_sniffer by explaining the name-keyed, bounded one-shot nature versus the id-keyed persistent sniffer.

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

Usage Guidelines5/5

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

It clearly tells the agent when this tool is appropriate versus create_device_sniffer and clarifies that triggering the capture or retrieving packets is out of scope. This prevents the agent from expecting the tool to start a live capture, which is handled elsewhere.

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

create_device_snifferA

Create a firewall sniffer definition on a managed device.

This targets the FortiGate's own persistent firewall sniffer object (device-DB, Configuration API firewall.json /firewall/sniffer) so the capture actually runs on the device's own traffic -- not FortiManager's separate, unrelated local diagnostic sniffer (/cli/global/system/sniffer, a different object that happens to share a name). Unlike FMG's local sniffer there is no packet-count cap or start/stop action: the definition captures continuously while status is "enable", same as any other persistent FortiOS config object -- disable or delete it to stop.

Args: device: Managed device name interface: Interface name traffic sniffing takes place on host: Hosts to filter for (e.g. "1.1.1.1", "2.2.2.0/24") port: Ports to sniff (e.g. "80", "1-1024") protocol: IANA protocol number as a string (e.g. "6" for TCP) vlan: VLAN(s) to sniff capture_ipv6: Include IPv6 packets (default: False) capture_non_ip: Include non-IP packets (default: False) status: "enable" or "disable" (default: "enable") logtraffic: "all", "utm", or "disable" (optional) sniffer_id: Explicit sniffer ID (0-9999); omit to let FortiOS assign the next available one vdom: VDOM the sniffer lives in (default "root")

Returns: Creation result including the new sniffer id

NameRequiredDescriptionDefault
hostNo
portNo
vdomNoroot
vlanNo
deviceYes
statusNoenable
protocolNo
interfaceYes
logtrafficNo
sniffer_idNo
capture_ipv6No
capture_non_ipNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses that the capture runs continuously while status='enable', that stopping requires disable/delete, and that there is no packet-count cap. It omits operational context an agent would want for a config mutation on FortiManager — whether an ADOM commit (commit_adom) or install is required for the change to take effect, and what happens if sniffer_id collides with an existing entry.

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

Conciseness4/5

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

The opening sentence front-loads the action and target, and the Args block is justified given zero schema coverage. The parenthetical path strings and backticked object names are somewhat verbose, but the material is substantive rather than filler.

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

Completeness4/5

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

For a 12-parameter mutation with no annotations, the description covers purpose, object identity, parameter formats, and lifecycle. An output schema exists so return values need not be explained (the extra 'Returns' line is harmless). The remaining hole is deployment semantics — commit/install requirements and ID-collision behavior — which matters for a FortiManager write tool.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it does: all 12 parameters are documented inline with formats and examples ('1.1.1.1', '2.2.2.0/24', '80', '1-1024', IANA protocol number as string), defaults for capture_ipv6/capture_non_ip/status/vdom, the 0-9999 range for sniffer_id, and auto-assignment semantics when omitted. This adds substantial meaning beyond the bare JSON schema types.

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

Purpose5/5

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

States a specific verb and resource ('Create a firewall sniffer definition on a managed device') and pins down exactly which object is created (device-DB firewall.json /firewall/sniffer). It explicitly disambiguates from the same-named FortiManager local diagnostic sniffer, so the agent knows this is a persistent FortiOS config object, not a local capture.

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

Usage Guidelines4/5

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

Gives clear context for choosing this over the FortiManager local sniffer and clarifies the lifecycle difference ('no packet-count cap or start/stop action... disable or delete it to stop'). It does not however route the agent between this and sibling tools like create_device_on_demand_sniffer or start_packet_capture, so the alternative choice is only partially resolved.

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

create_device_vapA

Create a wireless VAP (SSID) in a device's device DB.

The VAP becomes broadcastable once added to a FortiAP profile (assign_vap_to_wtp_profile).

Args: device: Managed device name name: VAP object name ssid: SSID to broadcast security: Security mode, a FortiOS wireless-controller vap security enum value; default "wpa2-only-personal". Supported here: the personal modes ("wpa-personal", "wpa-only-personal", "wpa2-only-personal"), the SAE modes ("wpa3-sae", "wpa3-sae-transition"), "owe" and "open". Enterprise and WEP modes are refused, since neither a radius/user-group nor a WEP key is set by this tool. passphrase: Credential, 8-63 characters, required by the personal and SAE modes. It is sent as passphrase for the personal modes and as sae-password for SAE; transition mode carries both, since it runs a WPA2 leg alongside SAE. vlanid: VLAN id to map wireless clients into vdom: VDOM the VAP lives in (default "root")

Returns: Creation result with any echoed passphrase stripped

NameRequiredDescriptionDefault
nameYes
ssidYes
vdomNoroot
deviceYes
vlanidNo
securityNowpa2-only-personal
passphraseNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it enumerates the accepted security modes, explains that enterprise and WEP modes are refused because no radius/user-group or WEP key is set, and discloses that the echoed passphrase is stripped from the result — a security-relevant behavior.

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

Conciseness4/5

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

Front-loaded with the core action, then organized into Args and Returns sections with no wasted sentences. The security sentence is long but each clause conveys a real constraint (accepted modes, refusals, rationale), so the length is justified.

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

Completeness5/5

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

Covers creation semantics, all parameter semantics, mode restrictions, and output behavior for a 7-parameter mutation tool with no annotations. Even though an output schema exists, it adds the passphrase-stripping detail that materially affects how an agent handles the response.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate and does: every one of the 7 parameters is explained, including the passphrase 8-63 length constraint, which modes require it, how it is mapped (passphrase vs sae-password, both for transition mode), the security default, and the vdom default.

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

Purpose5/5

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

States a specific verb and resource — create a wireless VAP (SSID) in a device's device DB — with an immediate parenthetical defining VAP. It is clearly distinguishable from siblings like create_device_wtp, list_device_vaps, and assign_vap_to_wtp_profile.

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

Usage Guidelines4/5

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

Explains the workflow position: the VAP is not broadcastable until it is added to a FortiAP profile via assign_vap_to_wtp_profile, naming the sibling that follows. It gives clear context but does not state exclusions or alternatives for creating the VAP itself.

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

create_device_wtpA

Register a managed FortiAP in a device's device DB.

This is the wireless-controller.wtp table: the mapping from a physical AP's serial number to the profile it runs. A wtp-profile that exists in the device DB but is not referenced by any wtp entry is pruned by FortiManager on install, so registering the AP here is required before a profile-only setup survives install_device_settings.

Args: device: Managed device name wtp_id: FortiAP serial number (the wtp-id / table mkey) wtp_profile: FortiAP (WTP) profile name to assign name: Friendly display name admin: Authorization state: "discovered" (awaiting authorization), "enable" (authorized) or "disable"; default "discovered" location: Free-text location string comment: Free-text comment vdom: VDOM to register the AP in (default "root")

Returns: Creation result

NameRequiredDescriptionDefault
nameNo
vdomNoroot
adminNodiscovered
deviceYes
wtp_idYes
commentNo
locationNo
wtp_profileYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations exist, so the description carries the full burden, and it does disclose a non-obvious system behavior: unreferenced wtp-profiles are pruned by FortiManager at install time, making this registration a prerequisite for settings to persist. It does not cover permissions/ADOM locking, behavior on duplicate wtp_id, or whether the call is idempotent, so it stops short of full transparency for a mutation tool.

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

Conciseness4/5

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

The purpose and the pruning rationale are front-loaded before the parameter list, and every line of the Args block carries information. The sole waste is the 'Returns: Creation result' line, which adds nothing given an output schema exists.

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

Completeness4/5

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

For an eight-parameter mutation with no annotations, the description covers purpose, prerequisite rationale, and every argument, and a return explanation is unnecessary because an output schema exists. Remaining gaps are minor: no mention of failure modes (duplicate serial, nonexistent wtp_profile) or of the related update/delete tools an agent will need next.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it documents all eight parameters: device, wtp_id (explicitly identified as the serial number and table mkey), wtp_profile, name, admin with its three valid values and the 'discovered' default, location, comment, and vdom with its 'root' default. The enum values for admin are supplied only here, not in the schema.

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

Purpose5/5

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

The description gives a specific verb and resource ('Register a managed FortiAP in a device's device DB') and then names the exact underlying table (wireless-controller.wtp) as the serial-to-profile mapping. That domain framing lets an agent distinguish this from the profile-management siblings such as create_device_wtp_profile or assign_vap_to_wtp_profile without opening the schema.

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

Usage Guidelines4/5

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

It states a concrete precondition for use: a wtp-profile not referenced by any wtp entry is pruned on install, so registration is required for a profile-only setup to survive install_device_settings. That is clear 'when to use' context, but it never names alternatives (update_device_wtp, delete_device_wtp, list_device_wtps) or says when not to use it, e.g. when the AP entry already exists.

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

create_dlp_profileA

Create a DLP (Data Loss Prevention) profile.

The profile is created without rules. Rule management (config dlp profile / rule) is out of scope for this tool; add rules via the FortiManager GUI/CLI or a follow-up tool once this profile exists.

Args: adom: ADOM name name: Profile name comment: Optional comment feature_set: Flow or proxy-based inspection ("flow" or "proxy") dlp_log: Enable/disable DLP logging ("enable" or "disable") extended_log: Enable/disable extended logging ("enable" or "disable")

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created profile name - message: Status or error message

Example: >>> result = await create_dlp_profile( ... adom="root", ... name="Custom-DLP", ... feature_set="flow", ... dlp_log="enable", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
dlp_logNo
feature_setNo
extended_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose a meaningful behavioral trait beyond the signature — the created profile is empty and rules must be added elsewhere — plus the return-key shape. However, it says nothing about required permissions, ADOM lock prerequisites, idempotency or duplicate-name behavior, and whether the change needs a commit_adom to take effect, all of which matter for a create mutation on FortiManager.

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

Conciseness4/5

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

Front-loaded with purpose and the key scope caveat in the first two paragraphs, then structured Args/Returns/Example. The Example block largely restates the Args list and adds little, and the Returns block duplicates a structured output schema — mild redundancy rather than bloat.

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

Completeness4/5

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

For a six-parameter create mutation with no annotations, the definition covers purpose, the empty-ruleset consequence, all parameter values, and error/status signaling (reinforced by an output schema). The one consequential omission is the FortiManager workflow prerequisite — locking the ADOM and committing after creation — which an agent could easily get wrong.

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

Parameters5/5

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

Schema description coverage is 0% and there are no enums in the schema, yet the description documents every one of the six parameters, including the constrained value sets the agent could not otherwise infer (feature_set = "flow"|"proxy", dlp_log / extended_log = "enable"|"disable") and notes comment is optional. This is exactly the compensation a low-coverage schema needs.

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

Purpose4/5

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

Specific verb + resource ("Create a DLP profile") that is trivially separable from the update_dlp_profile / delete_dlp_profile / get_dlp_profile / list_dlp_profiles siblings. It also adds a real scope nuance — the profile is created empty, with no rules — which changes what the agent should expect to do next. It does not name the sibling tools explicitly, so it stops just short of 5.

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

Usage Guidelines4/5

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

Clearly states when this tool is *not* sufficient (rule management is out of scope) and redirects to the FortiManager GUI/CLI or a follow-up tool. What's missing is the positive-side routing: nothing says to use update_dlp_profile for later modification, or that ADOM should be locked first in FortiManager workflows.

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

create_dnsfilter_profileB

Create a DNS filter profile.

Args: adom: ADOM name name: Profile name comment: Optional comment block_action: Action for blocked domains - "block", "redirect", or "block-sevrfail" (optional) block_botnet: Enable/disable blocking botnet C&C DNS lookups - "enable" or "disable" (optional) safe_search: Enable/disable Google/Bing/YouTube/etc. safe search - "enable" or "disable" (optional)

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created profile name - message: Status or error message

Example: >>> result = await create_dnsfilter_profile( ... adom="root", ... name="strict-dns", ... block_botnet="enable", ... safe_search="enable", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
safe_searchNo
block_actionNo
block_botnetNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the return contract (status/name/message), the allowed enum values for block_action and enable/disable for the toggles, and optionality of four params. It omits operational behavior: required ADOM lock/workspace state, failure modes beyond a generic "error" status, and whether existing profiles conflict.

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

Conciseness4/5

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

Purpose line is front-loaded and the Args block is tight and scannable. The Returns section restates information already available in the output schema, which is minor redundancy but wastes some space.

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

Completeness4/5

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

For a 6-parameter create tool with zero schema descriptions and no annotations, the definition covers purpose, every parameter's meaning and value constraints, and the response shape. The main gap is the absence of any dependency/prerequisite context (ADOM lock, prior creation of the ADOM) that an agent would want before calling.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must do all the work — and it does, documenting all six parameters, including the constrained value sets for block_action ("block", "redirect", "block-sevrfail") and the enable/disable toggles, plus default-optional marking. Only safe_search's domain list ("Google/Bing/YouTube/etc.") is left loose.

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

Purpose4/5

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

Opening line states a specific verb+resource ("Create a DNS filter profile"), which distinguishes it from the sibling read/update/delete/list variants by verb alone. It stops short of explicitly naming those siblings or the scope (ADOM-level), so a 5 isn't warranted.

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

Usage Guidelines2/5

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

The only usage signal is the example call and the word "Create". It never says when to prefer this over update_dnsfilter_profile/list_dnsfilter_profiles, nor states prerequisites (e.g. whether the ADOM must be locked or exist first).

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 new firewall policy.

Creates a firewall policy in the specified policy package. The policy won't be active until the package is installed to devices.

Args: adom: ADOM name package: Policy package name name: Policy name srcintf: Source interfaces (e.g., ["internal"]) dstintf: Destination interfaces (e.g., ["wan1"]) srcaddr: Source addresses (e.g., ["all"]) dstaddr: Destination addresses (e.g., ["all"]) service: Services (e.g., ["ALL", "HTTP", "HTTPS"]) action: Policy action - "accept" or "deny" (default: "accept") schedule: Schedule object name (default: "always") nat: Enable NAT (default: False) logtraffic: Log mode - "all", "utm", or "disable" (default: "utm") status: Policy status - "enable" or "disable" (default: "enable") comments: Policy comments (optional) policyid: Specific policy ID (optional, auto-assigned if not set) srcaddr_negate: Match all sources EXCEPT srcaddr (optional; omitted from the payload when not set, leaving the FortiManager default) dstaddr_negate: Match all destinations EXCEPT dstaddr (optional) service_negate: Match all services EXCEPT service (optional) utm_status: Enable/disable security profile inspection on this policy (optional). Required (True) for any of the profile fields below to actually apply. av_profile: Antivirus profile name, e.g. "default" (optional) ips_sensor: IPS sensor name, e.g. "default" (optional) webfilter_profile: Web filter profile name (optional) dnsfilter_profile: DNS filter profile name (optional) application_list: Application control list name (optional) file_filter_profile: File filter profile name (optional) ssl_ssh_profile: SSL/SSH inspection profile name, e.g. "certificate-inspection" (optional) profile_protocol_options: Protocol options profile name (optional). Mutually exclusive with profile_group -- it is itself a member of the FortiOS firewall profile-group object, so FortiOS rejects setting both profile_group: Security profile group name (optional). Mutually exclusive with av_profile, ips_sensor, webfilter_profile, dnsfilter_profile, application_list, file_filter_profile, ssl_ssh_profile, and profile_protocol_options -- FortiOS rejects setting both

Returns: dict: Create result with keys: - status: "success" or "error" - policyid: Created policy ID - message: Status or error message

Example: >>> result = await create_firewall_policy( ... adom="root", ... package="default", ... name="Allow-Web-Traffic", ... srcintf=["internal"], ... dstintf=["wan1"], ... srcaddr=["LAN-Subnet"], ... dstaddr=["all"], ... service=["HTTP", "HTTPS"], ... action="accept", ... nat=True, ... utm_status=True, ... av_profile="default", ... ips_sensor="default", ... )

NameRequiredDescriptionDefault
natNo
adomYes
nameYes
actionNoaccept
statusNoenable
dstaddrYes
dstintfYes
packageYes
serviceYes
srcaddrYes
srcintfYes
commentsNo
policyidNo
scheduleNoalways
av_profileNo
ips_sensorNo
logtrafficNoutm
utm_statusNo
profile_groupNo
dstaddr_negateNo
service_negateNo
srcaddr_negateNo
ssl_ssh_profileNo
application_listNo
dnsfilter_profileNo
webfilter_profileNo
file_filter_profileNo
profile_protocol_optionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses the install-activation lifecycle, defaults, optional-field omission behavior, UTM gating via utm_status, and mutual exclusions. It still does not mention permission/lock requirements, idempotency, or rollback/error semantics for a mutation tool.

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

Conciseness4/5

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

The description is appropriately front-loaded and structured into summary, args, returns, and example. For 28 parameters, the length is largely justified, though the returns section duplicates the existing output schema and the example repeats many defaults already covered in the args list.

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

Completeness4/5

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

For a complex 28-parameter mutation with no annotations, the description is quite complete: it covers every parameter, defaults, optional behavior, and important FortiOS constraints. It falls short of 5 because it omits operational prerequisites such as ADOM locking, permission requirements, and error/validation behavior.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate fully, and it does: all 28 parameters are documented with examples, defaults, optionality, enum-like values, negate semantics, and mutual-exclusion constraints. This is substantially more informative than the bare schema titles.

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

Purpose5/5

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

The description states a specific verb and resource, 'Create a new firewall policy,' and immediately scopes it to a policy package. The lifecycle note that the policy is not active until the package is installed clearly distinguishes creation from activation/install behavior.

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

Usage Guidelines3/5

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

The description gives useful context about package installation and defaults, but it does not explicitly say when to use this tool versus siblings such as update_firewall_policy or delete_firewall_policy. It also omits prerequisites such as whether the ADOM must be locked or referenced objects must already exist.

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

create_ips_sensorA

Create an IPS sensor.

The sensor is created empty (no signature filters/overrides). Use add_ips_sensor_signature_override to populate it afterward.

Args: adom: ADOM name name: Sensor name comment: Optional comment block_malicious_url: Enable/disable malicious URL blocking ("enable" or "disable") scan_botnet_connections: Botnet-server connection handling ("disable", "block", or "monitor") extended_log: Enable/disable extended logging ("enable" or "disable")

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created sensor name - message: Status or error message

Example: >>> result = await create_ips_sensor( ... adom="root", ... name="Custom-IPS", ... scan_botnet_connections="block", ... comment="Baseline IPS sensor", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
extended_logNo
block_malicious_urlNo
scan_botnet_connectionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description discloses several useful behaviors: the sensor is created empty, accepted enum-like values are listed, and the return status is described. However, it omits mutation-relevant details such as required permissions, duplicate-name behavior, ADOM lock requirements, and whether a commit is needed.

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

Conciseness4/5

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

The description is front-loaded with purpose and workflow, then uses structured Args/Returns/Example sections. It is generally efficient, though the Returns section somewhat duplicates the available output schema.

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

Completeness4/5

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

For a six-parameter creation tool with no annotations and low schema description coverage, it provides enough to invoke the tool correctly: all parameters, allowed values, creation semantics, follow-up workflow, and an example. The remaining gaps are operational behaviors like authorization, locking, and conflict handling.

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

Parameters5/5

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

The schema has 0% description coverage and no enums, so the description carries the full parameter burden. It documents all six parameters and supplies allowed values for block_malicious_url, scan_botnet_connections, and extended_log, which the schema itself does not provide.

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

Purpose5/5

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

The description starts with a specific verb and resource: 'Create an IPS sensor.' It also clarifies the resulting state ('created empty') and routes the agent to the related signature-override tool, distinguishing it from update/add-override siblings.

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

Usage Guidelines4/5

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

It gives clear workflow guidance: create the sensor first, then use add_ips_sensor_signature_override to populate it. It does not explicitly discuss when to use update_ips_sensor instead or mention prerequisites such as ADOM locking.

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

create_local_in_policyA

Create a new IPv4 local-in policy.

Local-in policies control traffic destined to the FortiGate's own management plane (GUI, SSH, ping, API, SNMP, etc.) -- a distinct object space from the regular firewall/policy table (create_firewall_policy), which governs traffic passing through the device. There is no srcintf/dstintf pair here: intf is the single incoming interface, since local-in traffic terminates on the FortiGate itself rather than being forwarded. A local-in policy only takes effect once its package is installed to a device (see preview_install / install_package).

Args: adom: ADOM name package: Policy package name intf: Incoming interface(s) this policy applies to, e.g. ["port1"] srcaddr: Source addresses this policy matches (e.g. ["Admin-Subnet"]) dstaddr: Destination addresses on the FortiGate itself (e.g. ["all"]) service: Services this policy matches, e.g. ["HTTPS", "SSH"] action: Policy action - "accept" or "deny" (default: "deny", the FortiOS field default -- unlike create_firewall_policy this defaults closed since it governs management-plane access) schedule: Schedule object name(s) (default: ["always"] if omitted) status: Policy status - "enable" or "disable" (default: "enable") logtraffic: Local-in traffic logging - "enable" or "disable" (optional) comments: Policy comments (optional) policyid: Specific policy ID (optional, auto-assigned if not set) srcaddr_negate: Match all sources EXCEPT srcaddr (optional) dstaddr_negate: Match all destinations EXCEPT dstaddr (optional) service_negate: Match all services EXCEPT service (optional) ha_mgmt_intf_only: Restrict this policy to the HA management interface only (optional). IPv4-only field -- there is no equivalent on create_local_in_policy6. virtual_patch: Enable/disable virtual patching on this policy (optional)

Returns: dict: Create result with keys: - status: "success" or "error" - policyid: Created policy ID - message: Status or error message

Example: >>> result = await create_local_in_policy( ... adom="root", ... package="default", ... intf=["port1"], ... srcaddr=["Admin-Subnet"], ... dstaddr=["all"], ... service=["HTTPS", "SSH"], ... action="accept", ... )

NameRequiredDescriptionDefault
adomYes
intfYes
actionNodeny
statusNoenable
dstaddrYes
packageYes
serviceYes
srcaddrYes
commentsNo
policyidNo
scheduleNo
logtrafficNo
virtual_patchNo
dstaddr_negateNo
service_negateNo
srcaddr_negateNo
ha_mgmt_intf_onlyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations exist, so the description carries the full burden, and it does substantial work: it discloses the install-to-take-effect requirement, the surprising closed-by-default action="deny" with rationale versus create_firewall_policy, and default behaviors for schedule/status/policyid auto-assignment. It omits permissions/ADOM locking requirements and whether duplicate creation is idempotent, which keeps it short of a 5.

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

Conciseness4/5

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

Front-loaded with purpose and the conceptual distinction before the parameter list, which is the right ordering. The Args block is long but justified by 0% schema coverage; the Returns block duplicates the existing output schema and the example, while useful, pushes length beyond what is strictly needed.

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

Completeness5/5

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

For a 17-parameter mutation tool with no annotations, the definition covers object space, all parameters, defaults, post-creation activation requirement, and a worked example. Return shape is already handled by the output schema, so nothing an agent needs to invoke this correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0% with 17 parameters, yet every parameter is documented in the description with type, examples, or semantics -- e.g. intf as the single incoming interface because there is no srcintf/dstintf pair, negate flags, and ha_mgmt_intf_only being IPv4-only. This fully compensates for the schema gap and adds meaning the schema cannot convey.

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

Purpose5/5

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

States a specific verb and resource ("Create a new IPv4 local-in policy") and immediately distinguishes the object space from create_firewall_policy and implicitly from create_local_in_policy6 ("IPv4-only field -- there is no equivalent on create_local_in_policy6"). An agent can tell exactly what this creates and what it is not.

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

Usage Guidelines4/5

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

Explains the domain distinction clearly: local-in governs traffic terminating on the FortiGate itself, while create_firewall_policy governs forwarded traffic, which routes the agent to the right sibling. It also discloses a critical usage prerequisite -- the policy only takes effect once its package is installed (see preview_install / install_package). No explicit "do not use when..." exclusion, but the context is sufficient to choose correctly.

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

create_local_in_policy6A

Create a new IPv6 local-in policy.

IPv6 counterpart of create_local_in_policy -- see that tool's docstring for the local-in-policy concept. srcaddr/dstaddr reference IPv6 address objects here. There is no ha_mgmt_intf_only field on this object type (it is IPv4-only on the appliance).

Args: adom: ADOM name package: Policy package name intf: Incoming interface(s) this policy applies to, e.g. ["port1"] srcaddr: Source IPv6 addresses this policy matches dstaddr: Destination IPv6 addresses on the FortiGate itself (e.g. ["all"]) service: Services this policy matches, e.g. ["HTTPS", "SSH"] action: Policy action - "accept" or "deny" (default: "deny", the FortiOS field default) schedule: Schedule object name(s) (default: ["always"] if omitted) status: Policy status - "enable" or "disable" (default: "enable") logtraffic: Local-in traffic logging - "enable" or "disable" (optional) comments: Policy comments (optional) policyid: Specific policy ID (optional, auto-assigned if not set) srcaddr_negate: Match all sources EXCEPT srcaddr (optional) dstaddr_negate: Match all destinations EXCEPT dstaddr (optional) service_negate: Match all services EXCEPT service (optional) virtual_patch: Enable/disable virtual patching on this policy (optional)

Returns: dict: Create result with keys: - status: "success" or "error" - policyid: Created policy ID - message: Status or error message

Example: >>> result = await create_local_in_policy6( ... adom="root", ... package="default", ... intf=["port1"], ... srcaddr=["Admin-Subnet-v6"], ... dstaddr=["all"], ... service=["HTTPS", "SSH"], ... action="accept", ... )

NameRequiredDescriptionDefault
adomYes
intfYes
actionNodeny
statusNoenable
dstaddrYes
packageYes
serviceYes
srcaddrYes
commentsNo
policyidNo
scheduleNo
logtrafficNo
virtual_patchNo
dstaddr_negateNo
service_negateNo
srcaddr_negateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations, so the description carries the full burden. It usefully discloses field defaults (action="deny" as the FortiOS default, schedule defaults to ["always"], status="enable") and that policyid is auto-assigned, but says nothing about required permissions, ADOM locking, or whether a commit is needed for the policy to take effect.

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

Conciseness4/5

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

Front-loaded with the one-line purpose and sibling reference, then a well-formed Args block whose length is justified by 16 parameters. The Returns section and example are somewhat redundant padding given an output schema exists, but nothing is misleading or wasted enough to hurt.

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

Completeness4/5

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

All 16 parameters are described and the IPv4/IPv6 delta is called out, which is more than most sibling tools offer. The return-value section duplicates the existing output schema, while the deployment lifecycle (lock, commit) is left unaddressed.

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

Parameters5/5

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

Schema description coverage is 0% and no enums are defined, yet the description documents every one of the 16 parameters with types, accepted values ("accept"/"deny", "enable"/"disable") and examples such as ["port1"] and ["HTTPS", "SSH"]. The negate flags and the meaning of dstaddr (addresses on the FortiGate itself) are explained rather than just named.

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

Purpose5/5

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

Opens with a specific verb+resource ("Create a new IPv6 local-in policy") and immediately positions it against the IPv4 sibling create_local_in_policy. The note that srcaddr/dstaddr reference IPv6 address objects removes the main ambiguity an agent could have between the two tools.

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

Usage Guidelines4/5

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

Tells the agent this is the IPv6 counterpart and to consult create_local_in_policy for the underlying concept, and flags that ha_mgmt_intf_only does not exist here because it is IPv4-only on the appliance. It gives clear context but stops short of explicit when-not-to-use or prerequisites (e.g. whether an ADOM lock or commit_adom is needed).

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

create_packageA

Create a new policy package.

Policy packages contain firewall policies, security profiles, and other configurations to be deployed to managed devices.

Args: adom: ADOM name name: Package name ngfw_mode: NGFW mode - "profile-based" (default) or "policy-based" central_nat: Enable central NAT (default: False)

Returns: dict: Create result with keys: - status: "success" or "error" - package: Created package name - message: Status or error message

Example: >>> result = await create_package( ... adom="root", ... name="Branch-Policy", ... ngfw_mode="profile-based" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
ngfw_modeNoprofile-based
central_natNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Without annotations, the description provides basic behavioral info (creates, returns dict) but lacks details on side effects, prerequisites, or failure modes.

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

Conciseness5/5

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

The description is well-structured with a clear one-line summary, Args, Returns, and an Example, with no unnecessary information.

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

Completeness4/5

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

The description explains parameters and return value well, but lacks mention of prerequisites (e.g., ADOM must exist) or edge cases like duplicate names.

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

Parameters5/5

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

Since schema description coverage is 0%, the description fully compensates by listing each parameter with type, default, and meaning in the Args section.

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

Purpose5/5

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

The description clearly states 'Create a new policy package' and explains what policy packages contain, distinguishing it from clone_package or delete_package.

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

Usage Guidelines3/5

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

The description implies it is for creating new packages but does not explicitly state when to use it vs. alternatives like clone_package or when not to use it.

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

create_scriptB

Create a new CLI script.

Args: adom: ADOM name name: Script name content: Script content (CLI commands) script_type: Script type - cli, tcl, cligrp, tclgrp, jinja (default: cli) target: Execution target (default: device_database) - device_database: Device Database - adom_database: Policy Package or ADOM Database - remote_device: Remote FortiGate Directly (via CLI) description: Script description

Returns: Created script details

NameRequiredDescriptionDefault
adomYes
nameYes
targetNodevice_database
contentYes
descriptionNo
script_typeNocli

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description must disclose behavior. It only states it creates a script and returns details, but fails to mention side effects like overwriting existing scripts, required permissions, or idempotency.

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

Conciseness4/5

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

The description is structured as a clear list of arguments and a return note. It is concise without unnecessary fluff, though it could be slightly more compact.

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

Completeness3/5

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

While the description covers all parameters and mentions return value, it lacks details on error handling, prerequisites, or what the output schema contains. With 6 parameters and an output schema, more context would improve completeness.

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

Parameters4/5

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

Schema coverage is 0%, so the description compensates by explaining all parameters, including enum values for script_type and target with their defaults. However, 'adom' is only described as 'ADOM name', lacking deeper context.

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

Purpose5/5

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

The description clearly states 'Create a new CLI script.' with a specific verb and resource. It distinguishes from siblings like execute_script_on_device and update_script through the action of creation.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives (e.g., execute_script_on_device, update_script). The description lacks context for appropriate use cases or prerequisites.

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

create_sdwan_templateB

Create a new SD-WAN template.

Creates an empty SD-WAN template that can be configured with interfaces, SLAs, and routing rules.

Args: adom: ADOM name name: SD-WAN template name description: Optional description

Returns: Created SD-WAN template

NameRequiredDescriptionDefault
adomYes
nameYes
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must convey behavioral traits. It mentions creating an empty template but omits details on permissions, idempotency, error behavior (e.g., duplicate names), or side effects. The description lacks sufficient behavioral context.

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

Conciseness4/5

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

The description is concise with a clear header, a brief paragraph, and an Args/Returns section. It is well-structured and front-loaded with the main action. No extraneous text.

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

Completeness3/5

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

Given the tool has 3 parameters, no annotations, and an output schema, the description covers the basic purpose and parameters but lacks guidance on usage context, prerequisites, and behavioral details. It is minimally adequate but not comprehensive.

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

Parameters3/5

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

Schema coverage is 0% (no descriptions in schema), so the description's parameter explanations add value but are minimal: 'ADOM name', 'SD-WAN template name', 'Optional description'. These are basic synonyms of the parameter names. No constraints, defaults, or format hints beyond the schema.

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

Purpose5/5

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

The description clearly states 'Create a new SD-WAN template' and explains it creates an empty template for later configuration with interfaces, SLAs, and routing rules. This distinguishes it from sibling tools like assign, delete, get, and list operations.

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

Usage Guidelines2/5

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

The description does not provide guidance on when to use this tool versus alternatives (e.g., when to create vs clone, prerequisites like existing ADOM, or situations where an empty template is needed). No explicit when-to-use or when-not-to-use information.

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.

Args: adom: ADOM name name: Group name members: List of service names to include comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created group name - message: Status or error message

Example: >>> result = await create_service_group( ... adom="root", ... name="Web-Services", ... members=["HTTP", "HTTPS", "DNS"], ... comment="Common web services" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
membersYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It describes a creation operation and return format, but fails to mention error handling (e.g., duplicate group name), required permissions, or whether the group can be updated later. Missing typical concerns for a mutation tool.

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

Conciseness5/5

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

The description is well-structured: one-line summary, bullet-style Args, Returns, and an example. It is front-loaded with the core purpose, and every sentence is informative. No redundancy or fluff.

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

Completeness4/5

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

The description covers purpose, parameters, return format with keys, and a concrete example. It is fairly complete for a simple create tool, but lacks mention of prerequisites (e.g., whether member services must exist) and conflict behavior. Still, it provides a solid functional contract.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate. It adds meaning by defining each parameter (e.g., 'members: List of service names to include') and clarifying the optional comment. The example further illustrates usage. This exceeds baseline, though param descriptions are brief.

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

Purpose5/5

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

The description clearly states 'Create a service group' with a specific verb and resource. It distinguishes from sibling tools like create_service_icmp and create_service_tcp_udp by focusing on grouping existing services, making its purpose unambiguous.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool versus alternatives like create_service_icmp or list_service_groups. While the function signature implies grouping, there is no guidance on selection criteria or when not to use it (e.g., for single-service creation).

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

create_service_icmpA

Create an ICMP service object.

Args: adom: ADOM name name: Service object name icmp_type: ICMP type (0-255, optional for all types) icmp_code: ICMP code (0-255, optional) comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created service name - message: Status or error message

Example: >>> # Create ping service (ICMP echo request) >>> result = await create_service_icmp( ... adom="root", ... name="Custom-Ping", ... icmp_type=8, ... comment="ICMP Echo Request" ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
icmp_codeNo
icmp_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations exist, so the description carries the full burden. It clearly explains that this tool creates an ICMP service, defines all parameters with ranges, and specifies the return format (dict with status, name, message). It does not disclose potential side effects or permissions, but for a simple create operation, this is adequate. No contradictions with annotations.

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

Conciseness5/5

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

Description is concise and well-structured with clear sections (Args, Returns, Example). The first sentence immediately states the purpose. No unnecessary words. Suitable length for the tool's complexity.

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

Completeness5/5

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

Given the tool's parameter count (5) and lack of annotations, the description covers inputs, outputs, and provides an example. The output schema exists but description still explains return fields. This is complete for an AI agent to understand and invoke the tool correctly.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate. Each parameter is described: adom as 'ADOM name', name as 'Service object name', icmp_type with range '0-255, optional for all types', icmp_code with range '0-255, optional', and comment as 'Optional comment'. The example adds practical context (icmp_type=8 for ping). This fully explains parameter semantics beyond the schema.

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

Purpose5/5

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

Description clearly states 'Create an ICMP service object' with a specific verb and resource. The example (ping with ICMP type 8) further clarifies. This distinguishes from siblings like create_service_tcp_udp and create_service_group, which are for other service types.

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

Usage Guidelines3/5

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

The description implies usage for ICMP service objects but does not explicitly state when to use this tool vs alternatives like create_service_tcp_udp. No 'when to use' or 'when not to use' guidance is provided. Sibling tools exist for TCP/UDP and service groups, but no comparison is made.

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

create_service_tcp_udpA

Create a TCP/UDP/SCTP/UDP-Lite service object.

Args: adom: ADOM name name: Service object name tcp_portrange: TCP port range (e.g., "80", "8080-8090", "80 443 8080") udp_portrange: UDP port range (e.g., "53", "500-502") sctp_portrange: SCTP port range (e.g., "3868", "2905-2907") udplite_portrange: UDP-Lite port range (e.g., "1234") comment: Optional comment

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created service name - message: Status or error message

Example: >>> # Create HTTP/HTTPS service >>> result = await create_service_tcp_udp( ... adom="root", ... name="Custom-Web", ... tcp_portrange="80 443 8080", ... comment="Custom web ports" ... )

>>> # Create DNS service
>>> result = await create_service_tcp_udp(
...     adom="root",
...     name="Custom-DNS",
...     tcp_portrange="53",
...     udp_portrange="53"
... )

>>> # Create SCTP service (Diameter)
>>> result = await create_service_tcp_udp(
...     adom="root",
...     name="Diameter",
...     sctp_portrange="3868",
...     comment="Diameter protocol"
... )
NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
tcp_portrangeNo
udp_portrangeNo
sctp_portrangeNo
udplite_portrangeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It clearly describes the creation behavior, input parameters, and return format. It does not explicitly state idempotency or whether duplicates are allowed, but the examples and return schema provide sufficient context for a standard create operation.

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

Conciseness3/5

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

The description is thorough but fairly long due to extensive examples. While well-structured with a clear flow (Args, Returns, Example), some redundancy exists in examples. It is acceptable but could be more concise.

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

Completeness4/5

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

Given the output schema is provided, the description covers all necessary aspects: parameter details, return format, and examples. It does not mention creation constraints like unique names or ADOM limitations, but the examples and standard service object concept imply these.

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

Parameters5/5

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

Schema coverage is 0%, meaning the description must fully compensate. It does so by explaining each parameter (tcp_portrange, udp_portrange, etc.) with format examples like '80', '8080-8090', '80 443 8080'. This adds significant meaning beyond the schema's type definitions.

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

Purpose5/5

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

The description clearly states 'Create a TCP/UDP/SCTP/UDP-Lite service object.' This is a specific verb+resource combination that distinguishes it from sibling tools like create_service_icmp or create_service_group.

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

Usage Guidelines4/5

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

The description includes multiple examples showing when to use TCP, UDP, SCTP, and UDP-Lite parameters. It implicitly guides the agent by demonstrating different use cases. However, it does not explicitly state when not to use this tool (e.g., for ICMP services), but the sibling context and name provide differentiation.

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

create_ssl_ssh_profileB

Create an SSL/SSH inspection profile.

Args: adom: ADOM name name: Profile name comment: Optional comment ssl_inspection: Generic SSL inspection level ("disable", "certificate-inspection", or "deep-inspection") https_inspection: HTTPS inspection level ("disable", "certificate-inspection", or "deep-inspection") caname: CA certificate(s) used for SSL inspection (datasource names) untrusted_caname: Untrusted CA certificate(s) (datasource names) server_cert: Certificate(s) used to replace the server certificate (datasource names; only used when server_cert_mode="replace") server_cert_mode: Re-sign or replace the server's certificate ("re-sign" or "replace") mapi_over_https: Enable/disable inspection of MAPI over HTTPS rpc_over_https: Enable/disable inspection of RPC over HTTPS

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created profile name - message: Status or error message

Example: >>> result = await create_ssl_ssh_profile( ... adom="root", ... name="Custom-Deep-Inspection", ... ssl_inspection="deep-inspection", ... https_inspection="deep-inspection", ... server_cert_mode="re-sign", ... comment="Deep inspection for outbound web traffic", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
canameNo
commentNo
server_certNo
rpc_over_httpsNo
ssl_inspectionNo
mapi_over_httpsNo
https_inspectionNo
server_cert_modeNo
untrusted_canameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It confirms this is a mutation that returns a status/name/message dict, but says nothing about side effects, permission or ADOM-lock requirements, idempotency on duplicate names, or validation failure behavior. The Returns block duplicates the existing output schema rather than adding behavioral context.

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

Conciseness4/5

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

Front-loaded one-line purpose followed by a scannable Args block, an example, and a Returns section; given 0% schema coverage the parameter enumeration is justified. The Returns section is somewhat redundant with the existing output schema and the example's necessary value is modest, but there is no filler prose.

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

Completeness3/5

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

For an 11-parameter mutation with no annotations, the parameter surface is well covered, but key operational context is missing: prerequisites (ADOM scope, existing CA certificate objects), name-collision behavior, and any caveat about SSL deep-inspection implications. Since an output schema exists, the Returns block need not have been repeated.

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

Parameters4/5

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

Schema description coverage is 0% across 11 parameters, and the description compensates almost fully: it names the allowed values for ssl_inspection/https_inspection ('disable', 'certificate-inspection', 'deep-inspection'), server_cert_mode ('re-sign'/'replace'), notes that caname/untrusted_caname/server_cert are datasource names, and states the conditional dependency that server_cert is only used when server_cert_mode='replace'. Minor gaps remain (mapi_over_https/rpc_over_https are only described as 'Enable/disable' without stating accepted literal values).

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

Purpose4/5

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

States a specific verb+resource ('Create an SSL/SSH inspection profile') that is unambiguous against siblings like update_ssl_ssh_profile, get_ssl_ssh_profile, and list_ssl_ssh_profiles. It does not explicitly name a sibling or a disambiguation condition, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no prerequisites (e.g., ADOM must be unlocked/editable, referenced CA certificate datasources must already exist), and no mention of what to do if a profile with that name already exists (vs. update_ssl_ssh_profile). Usage is only implied by the verb 'Create'.

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

create_waf_profileA

Create a WAF (Web Application Firewall) profile.

The profile is created with FortiManager/FortiOS defaults for its nested signature/constraint/method/url-access sections. Fine-grained control of those sections is out of scope for this tool; adjust them via the FortiManager GUI/CLI or a follow-up tool once this profile exists.

Args: adom: ADOM name name: Profile name comment: Optional comment external: Enable/disable external HTTP inspection ("enable" or "disable") extended_log: Enable/disable extended logging ("enable" or "disable")

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created profile name - message: Status or error message

Example: >>> result = await create_waf_profile( ... adom="root", ... name="Custom-WAF", ... extended_log="enable", ... comment="Baseline WAF profile", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
externalNo
extended_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does a solid job: it discloses that nested sections are created with FortiManager/FortiOS defaults, which is the key behavioral fact an agent needs to avoid assuming it can configure signatures here. It does not cover permission/locking requirements or idempotency on duplicate names, which is the remaining gap.

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

Conciseness4/5

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

The prose is front-loaded: purpose first, then the important scoping caveat, then args. The Args/Returns/Example blocks are conventional but partly redundant since the input schema and an output schema already exist; the example is still a cheap concrete usage anchor.

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

Completeness4/5

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

An output schema exists, so the Returns block is not strictly needed, but the description still adds the one thing that matters most for this tool: the defaults caveat on nested sections. It is complete enough to call correctly, with the only real omission being whether the target ADOM must be locked before creating.

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

Parameters3/5

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

Schema description coverage is 0%, and the description does document all five parameters plus value domains for external and extended_log ('enable'/'disable') that the schema lacks (they are untyped strings with no enum). However, adom, name, and comment get only tautological glosses ('ADOM name', 'Profile name', 'Optional comment'), so it only partially compensates for the coverage gap.

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

Purpose5/5

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

The description leads with a specific verb+resource: 'Create a WAF (Web Application Firewall) profile.' Combined with the sibling set (get_waf_profile, update_waf_profile, list_waf_profiles, delete_waf_profile), the scope of this tool is unambiguous, and the follow-up paragraph clarifies exactly what the created object contains versus what it does not.

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

Usage Guidelines4/5

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

It explicitly states when the tool is insufficient: fine-grained control of nested signature/constraint/method/url-access sections is 'out of scope' and must be done via GUI/CLI 'or a follow-up tool once this profile exists.' That is a clear when/when-not statement, though the follow-up tool (update_waf_profile) is never named and no prerequisites (e.g. ADOM locking) are given.

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

create_webfilter_profileB

Create a web filter profile.

Args: adom: ADOM name name: Profile name comment: Optional comment feature_set: Flow/proxy feature set - "proxy" or "flow" (optional) log_all_url: Enable/disable logging all URLs visited - "enable" or "disable" (optional) web_content_log: Enable/disable logging blocked web content - "enable" or "disable" (optional)

Returns: dict: Create result with keys: - status: "success" or "error" - name: Created profile name - message: Status or error message

Example: >>> result = await create_webfilter_profile( ... adom="root", ... name="strict-web", ... feature_set="flow", ... log_all_url="enable", ... )

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
feature_setNo
log_all_urlNo
web_content_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose the return keys (status/name/message), which is genuinely useful, and that adom and name are mandatory. It omits important FortiManager behaviors an agent needs: that a create can fail on duplicate names, that the change is not active until commit_adom, and any required permissions or locking.

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

Conciseness4/5

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

The docstring is front-loaded with the purpose and then structured into Args/Returns/Example, so an agent can skim it. The Returns block is largely redundant given an output schema exists, and the example, while helpful, adds length without new semantics.

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

Completeness3/5

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

An output schema exists, so the Returns section is unnecessary duplication, and the description's remaining gap is the lifecycle context a create-mutation tool needs in this API (ADOM locking, commit requirement, duplicate-name handling). Useful parameter documentation and an example are provided, but the operational context is incomplete.

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

Parameters4/5

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

Schema description coverage is 0%, and the description compensates by documenting all six parameters, including allowed values for feature_set ("proxy"/"flow") and the enable/disable strings for log_all_url and web_content_log — information the bare schema does not carry as enums. Only adom's guidance ("ADOM name") is thin, which keeps it below a 5.

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

Purpose4/5

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

The description opens with a specific verb+resource ("Create a web filter profile") that unambiguously identifies a mutation on a webfilter profile object. It does not, however, differentiate this tool from the sibling update_webfilter_profile or explain where the new profile is placed (ADOM scope), which the adom parameter only implies.

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

Usage Guidelines2/5

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

There is no guidance on when to create versus update an existing profile, no prerequisites (e.g., ADOM must be locked), and no mention of when a commit is required afterward. The only usage signal is the two required parameters.

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 object.

WARNING: This will fail if the address is in use by policies or groups.

Args: adom: ADOM name name: Address object name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It discloses the failure condition (address in use) and return structure, but lacks details on permissions, side effects, or behavior when the address does not exist. Adequate but not comprehensive.

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

Conciseness4/5

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

The description is concise (2 sentences plus structured Args/Returns) and front-loads the purpose and warning. Every sentence serves a purpose, though the Args/Returns could be more concise.

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

Completeness4/5

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

Given a simple delete tool with an output schema, the description covers the purpose, a key failure condition, and return format. Missing details like behavior for non-existent addresses, but overall sufficient for effective use.

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

Parameters3/5

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

Schema coverage is 0%, so the description must explain parameters. It provides basic explanations ('ADOM name', 'Address object name to delete'), which adds minimal value over the raw schema. With only two simple parameters, this is acceptable but not exemplary.

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

Purpose5/5

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

The description clearly states the verb 'Delete' and the resource 'firewall address object'. Among sibling tools like 'delete_address_group' and 'delete_firewall_policy', this tool's purpose is well differentiated.

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

Usage Guidelines2/5

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

The description includes a warning about failure when the address is in use, but does not provide explicit guidance on when to use this tool versus alternatives like 'update_address' or other delete tools. No alternatives are mentioned.

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.

WARNING: This will fail if the group is in use by policies.

Args: adom: ADOM name name: Group name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states the tool deletes (mutation) and may fail, but it does not disclose permission requirements, reversibility, or side effects (e.g., no mention of cascading effects). The return structure is described, but behavioral traits are minimal.

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

Conciseness5/5

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

The description is extremely concise: one sentence for purpose, one warning, two parameter clarifications, and a return type. Every sentence earns its place with no redundancy. The structure front-loads the action and warning.

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

Completeness3/5

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

Given the simplicity (two required string parameters, no nested objects), the description covers the basic operation and output schema. However, it omits error cases beyond the warning, whether the tool is idempotent, and the expected behavior if the group does not exist. For a mutation tool, 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.

Parameters4/5

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

The input schema provides only titles ('Adom', 'Name'), but the description adds meaning by labeling them 'ADOM name' and 'Group name to delete', which clarifies the purpose of each parameter. With 0% schema description coverage, this compensation is effective, though it could be more detailed (e.g., allowed values).

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

Purpose5/5

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

The description clearly states 'Delete an address group.' This is a specific verb and resource combination. Among siblings like delete_address, delete_service_group, etc., it is distinct because it explicitly targets address groups, not individual addresses or other objects.

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

Usage Guidelines2/5

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

The description includes a warning that deletion will fail if the group is in use by policies, but it does not provide explicit guidance on when to use this tool versus alternatives (e.g., update_address_group or delete_address). There is no mention of prerequisites or when not to use it.

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

delete_antivirus_profileB

Delete an antivirus profile.

WARNING: This will fail if the profile is in use by firewall policies.

Args: adom: ADOM name name: Profile name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden: it does disclose the destructive nature and the in-use failure mode, which is the most important behavior. It omits irreversibility, whether an ADOM lock is required, and permission prerequisites, which matter for a delete operation on a FortiManager object.

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

Conciseness4/5

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

The purpose and the warning are front-loaded and the whole thing is short. The Args/Returns blocks are boilerplate, and the Returns section largely duplicates the existing output schema, but the cost is small.

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

Completeness3/5

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

An output schema exists, so the Returns block is redundant rather than necessary. For an unannotated destructive tool, the description covers the key failure mode but leaves out irreversibility and any prerequisite steps, so it is adequate rather than complete.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate; it does provide a one-line gloss for both parameters (adom = ADOM name, name = profile name to delete), which is more than the bare titles. It adds no format, casing, or lookup guidance, so the compensation is minimal.

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

Purpose4/5

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

States a specific verb and resource ('Delete an antivirus profile'), which cleanly separates it from the many sibling delete_* tools for other profile types. It does not explicitly name a sibling or a related alternative, so it lands just short of the top band.

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

Usage Guidelines3/5

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

The WARNING line gives a concrete precondition for failure (profile in use by firewall policies), which is real usage guidance. However, it never says how to proceed — e.g. use find_object_usage or policy_lookup to check references first, or list_antivirus_profiles to confirm the exact name — so the when-to-use context is implied rather than prescribed.

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

delete_application_listA

Delete an application-control list.

WARNING: This will fail if the list is in use by firewall policies.

Args: adom: ADOM name name: List name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It discloses the destructive action, a failure condition, and return status keys, but does not state whether deletion is irreversible or what authorization is required.

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

Conciseness5/5

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

The description is short and front-loaded: action first, warning second, then parameter and return notes. Every sentence contributes useful information without padding.

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

Completeness4/5

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

For a simple two-parameter delete tool, the description covers the action, the main failure condition, and the return shape. It is nearly complete, though it could mention irreversibility or required permissions given the absence of annotations.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must define both parameters. It identifies adom as the ADOM name and name as the list name to delete, covering both required fields, but adds little detail about format or constraints.

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

Purpose5/5

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

The description states a specific verb and resource: "Delete an application-control list." It clearly distinguishes this tool from siblings such as get/list/create/update_application_list by naming the exact object and action.

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

Usage Guidelines4/5

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

It gives a clear usage constraint: the delete will fail if the list is in use by firewall policies. This acts as a when-not condition, though it does not explicitly name an alternative such as checking object usage first.

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

delete_cli_template_groupB

Delete a CLI template group.

Args: adom: ADOM name name: CLI template group name

Returns: Deletion result

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool deletes a group, but does not explain whether the action is reversible, what cascading effects occur, or what permissions are required. The description is too minimal.

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

Conciseness4/5

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

The description is very concise, with no unnecessary words. Every sentence adds value, but it could be slightly expanded to include usage context without being verbose.

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

Completeness2/5

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

Given that no annotations are present and there is an output schema, the description still lacks details about destructive behavior, permissions, and special cases (e.g., what happens if the group is in use). It is insufficient for a delete operation.

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

Parameters3/5

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

Schema description coverage is 0%, but the description adds basic meaning to both parameters: 'adom: ADOM name' and 'name: CLI template group name'. This adds value beyond the schema, though it does not provide format or constraints.

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

Purpose5/5

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

The description clearly states 'Delete a CLI template group', which is a specific verb ('Delete') and resource ('CLI template group'), and it distinguishes itself from sibling tools like create_cli_template_group, get_cli_template_group, and list_cli_template_groups.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, nor does it mention prerequisites, conditions, or limitations. It only lists the arguments.

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

delete_deviceA

Delete a device from FortiManager.

Removes a device registration. Does not affect the actual device or its configuration - only removes it from FortiManager management.

WARNING: This operation cannot be undone.

Args: adom: ADOM name where device is located device: Device name to delete flags: Additional flags like ["create_task"]

Returns: dict: Delete result with keys: - status: "success" or "error" - task_id: Task ID if run as background task - message: Status or error message

Example: >>> result = await delete_device("root", "FGT-OldBranch") >>> if result['status'] == 'success': ... print("Device removed from FortiManager")

NameRequiredDescriptionDefault
adomYes
flagsNo
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries full burden. It discloses the destructive nature ('cannot be undone'), that it does not affect the actual device, and describes the return structure. It lacks details on auth needs or rate limits, but provides sufficient context.

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

Conciseness5/5

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

The description is well-structured: brief one-liner, paragraph, Args/Returns sections, and an example. Every sentence adds value with no fluff, making it efficient and easy to parse.

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

Completeness4/5

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

Given the presence of an output schema and sibling tools, the description covers purpose, effect, parameters, return values, and provides an example. It is fairly complete, though it could mention what happens if the device does not exist.

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

Parameters4/5

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

With 0% schema description coverage, the description adds meaning by explaining each parameter: adom, device, and flags (with example). This compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description clearly states 'Delete a device from FortiManager' and explains the scope: 'Removes a device registration. Does not affect the actual device or its configuration.' This distinguishes it from sibling tools like add_device or get_device.

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

Usage Guidelines4/5

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

The description explains when to use the tool (to remove a device from FortiManager management) and warns that it cannot be undone. It does not explicitly mention alternatives or prerequisites, but given the sibling tools, no other deletion tool exists for devices.

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

delete_device_dhcp_serverA

Delete a DHCP server scope from a device's device DB.

Args: device: Managed device name dhcp_server_id: Numeric scope id (see list_device_dhcp_servers) vdom: VDOM the scope lives in (default "root")

Returns: Deletion result

NameRequiredDescriptionDefault
vdomNoroot
deviceYes
dhcp_server_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It identifies the operation as a deletion, but does not disclose permission requirements, irreversibility, what else may be affected in the device DB, or safeguards around destructive changes.

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

Conciseness4/5

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

The description is front-loaded with the purpose and then cleanly structured into Args and Returns. It is appropriately sized, though the vague 'Returns: Deletion result' is redundant given the output schema.

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

Completeness3/5

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

The description covers purpose, all parameters, and a minimal return statement, and an output schema exists for return details. For a destructive, unannotated mutation, however, it lacks sufficient context about safety, permissions, and when-not-to-use behavior.

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

Parameters4/5

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

With 0% schema description coverage, the description documents all three parameters: device as the managed device name, dhcp_server_id as a numeric scope id with a pointer to list_device_dhcp_servers, and vdom with its default of 'root'. This adds useful meaning beyond the schema types.

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

Purpose5/5

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

The description states a specific verb and resource: delete a DHCP server scope from a device's device DB. It is clearly distinct from sibling tools like list_device_dhcp_servers, create_device_dhcp_server, and update_device_dhcp_server.

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

Usage Guidelines3/5

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

Usage is implied by the verb 'delete' and by the reference to list_device_dhcp_servers for obtaining the scope id. However, there is no explicit guidance on when to use this tool versus update or list, and no prerequisites or exclusion cases are stated.

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

delete_device_groupA

Delete a device group from FortiManager.

Removes the group object itself. Member devices are not affected -- only their group membership is removed.

WARNING: This operation cannot be undone.

Args: adom: ADOM name where the group is located name: Group name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await delete_device_group("root", "Branch-Firewalls")

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses irreversibility, states the exact blast radius (group object gone, member devices untouched, only membership removed), and sketches the return shape. It stops short of auth/permission requirements or whether ADOM locking is needed.

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

Conciseness4/5

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

Front-loaded with the action and the irreversibility warning, then scoping, then args. The Returns block and the example are somewhat redundant given an output schema exists and the call signature is already unambiguous, so a little trimming is possible.

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

Completeness4/5

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

For a 2-parameter destructive tool with no annotations this covers the essentials: what is destroyed, what is not, and the response keys. The main gap is operational context — required permissions or whether the ADOM must be unlocked — which matters for a delete.

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

Parameters4/5

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

Schema coverage is 0% and both properties are bare title-only strings, so the description must compensate — and it does, explaining that adom is the ADOM where the group lives and name is the group to delete. Meaning is added, though neither parameter gets format or validation detail.

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

Purpose5/5

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

States a specific verb and resource ("Delete a device group from FortiManager") and immediately scopes it: only the group object is removed, member devices survive. That clarification effectively separates it from delete_devices_bulk and the remove_*_from_group siblings without needing to name them.

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

Usage Guidelines3/5

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

Usage is implied by the destructive warning and the scoping note, but the description never says when to prefer remove_device_from_group / remove_devices_from_group_bulk over deleting the group outright, nor any precondition such as ADOM lock or policy references. The agent must infer the routing decision.

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

delete_device_interfaceC

Delete an interface from a device's device DB.

Args: device: Managed device name name: Interface name to delete

Returns: Deletion result

NameRequiredDescriptionDefault
nameYes
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden for a destructive mutation. It says only that a 'Deletion result' is returned; it does not disclose irreversibility, whether the interface must be unused or unassigned, whether a commit is needed afterwards, or what happens to dependent configuration.

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

Conciseness4/5

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

The lead sentence is front-loaded and sufficient on its own; the Args and Returns blocks are short and structured. Little waste, though the Returns line is largely redundant given an output schema exists.

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

Completeness3/5

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

An output schema exists, so the return value need not be explained. Two required params are documented. What is missing for a destructive network-interface tool is the operational context: side effects, safety checks, and whether follow-up commit/install is required.

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

Parameters3/5

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

Schema coverage is 0%, so the description's Args block is doing real work: it clarifies that 'device' is a managed device name and 'name' is the interface name to delete, disambiguating two same-typed string params. However, the glosses are minimal and add no format or naming-convention detail (e.g. 'port1', ADOM scope).

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

Purpose4/5

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

States a specific verb and resource ('Delete an interface from a device's device DB'), which the agent can distinguish from create_device_interface and update_device_interface by the verb alone. It never names those siblings explicitly, so differentiation is implicit rather than stated.

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

Usage Guidelines2/5

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

No indication of when to use this versus updating an interface config or why a deletion might be preferred over disabling the interface. There is no mention of prerequisites such as locking the ADOM, and no note that this is a destructive operation.

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

delete_device_ipsec_phase1_interfaceA

Delete an IPsec phase1-interface from a device's device DB.

Any phase2-interface still pointing at this phase1name should be deleted first (delete_device_ipsec_phase2_interface) -- FortiManager rejects deleting a phase1-interface a phase2-interface still references.

Args: device: Managed device name name: Phase1-interface (remote gateway) name to delete vdom: VDOM it lives in (default "root")

Returns: Deletion result

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and it does disclose the key behavioral constraint: the delete will be rejected while a dependent phase2-interface exists, and which tool to call first. It omits whether the deletion is reversible, whether a commit/install step is required to push the change to the device, and any permission prerequisites — meaningful gaps for a destructive mutation, keeping it below 5.

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

Conciseness4/5

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

Front-loaded with the action sentence, followed by the ordering caveat, then a compact Args block. The 'Returns: Deletion result' line is dead weight since an output schema already exists, but overall there is little waste.

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

Completeness4/5

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

Output schema covers return values and the Args block covers all inputs, so the description need only carry the operational caveats — which it does via the phase2 dependency. The remaining omission is whether the change requires a follow-up commit/install to take effect on the managed device.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate, and it does name all three parameters with the default for vdom. But the added meaning is thin — 'Phase1-interface (remote gateway) name' is the only real semantic enrichment over the schema titles, and there is no note on name format, name-vs-device uniqueness, or valid vdom values.

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

Purpose5/5

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

States a specific verb and resource ('Delete an IPsec phase1-interface from a device's device DB') and scopes it to the device DB rather than an ADOM/package. It is trivially distinguishable from siblings like delete_device_ipsec_phase2_interface, update_device_ipsec_phase1_interface, and create_device_ipsec_phase1_interface.

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

Usage Guidelines5/5

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

Gives an explicit precondition: any phase2-interface still pointing at this phase1name must be deleted first, and names the exact sibling tool (delete_device_ipsec_phase2_interface) to do it. It even explains the failure mode ('FortiManager rejects deleting a phase1-interface a phase2-interface still references'), so ordering is unambiguous.

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

delete_device_ipsec_phase2_interfaceB

Delete an IPsec phase2-interface from a device's device DB.

Args: device: Managed device name name: Phase2-interface (tunnel) name to delete vdom: VDOM it lives in (default "root")

Returns: Deletion result

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations, so the description carries the full disclosure burden for a destructive operation, and it does little beyond implying deletion. It doesn't say the removal is permanent, what happens to dependent phase2 entries or IPSec tunnels, whether ADOM locking is required, or that a commit/install is needed for the change to take effect. 'device DB' is the only hint of scope.

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

Conciseness4/5

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

Front-loaded one-line purpose followed by a tight Args/Returns block with no filler. The Returns line is near-redundant given an output schema exists, but it costs almost nothing.

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

Completeness3/5

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

The existence of an output schema means return values need not be explained here. However, for a destructive, unannotated tool in a FortiManager-style workflow, the description omits the operational context an agent needs: dependency on the phase1 interface, ADOM lock, and commit semantics.

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

Parameters4/5

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

Schema coverage is 0%, but the description compensates well: it explains device as the managed device name, name as the phase2-interface/tunnel name, and vdom as the VDOM with a 'root' default. All three parameters are given meaning beyond their bare titles.

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

Purpose4/5

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

States a specific verb and resource: delete an IPsec phase2-interface from a device's device DB. The resource is precise enough to separate it from the sibling delete_device_ipsec_phase1_interface and the create/update/get variants, though it doesn't name those siblings explicitly.

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

Usage Guidelines2/5

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

No guidance on when to use this versus the create/update variants, no preconditions such as whether the phase1 parent must exist, the ADOM must be locked, or a commit is required afterwards. The agent must infer all of that 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.

delete_devices_bulkA

Delete multiple devices from FortiManager in bulk.

Removes multiple device registrations at once.

WARNING: This operation cannot be undone.

Args: adom: ADOM name where devices are located devices: List of device names to delete flags: Additional flags like ["create_task"]

Returns: dict: Bulk delete result with keys: - status: "success" or "error" - requested_count: Number of devices in the request. NOT a count of devices actually deleted: the delete runs as a task, so per-device results only exist once it completes. - task_id: Task ID if run as background task - message: Error message if failed

Example: >>> result = await delete_devices_bulk("root", ["FGT-Old1", "FGT-Old2"])

NameRequiredDescriptionDefault
adomYes
flagsNo
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so well: it warns that the operation cannot be undone and explains the asynchronous task semantics ('per-device results only exist once it completes') so requested_count is not mistaken for actual deletions. That is exactly the kind of context annotations would otherwise provide.

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

Conciseness4/5

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

Front-loaded and scannable, with a clear warning, Args, Returns, and a minimal example. The first two sentences restate the same idea ('bulk' / 'at once'), which is minor redundancy.

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

Completeness4/5

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

For a destructive, task-backed operation with no annotations and 0% schema coverage, the description covers the essentials: danger warning, parameter meanings, task semantics, and a return-key explanation. It could go further on prerequisites (e.g., ADOM locking or exactly what create_task changes), but the key gap-filling is present.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and does: adom, devices, and flags are all explained, including an example flag value ('create_task'). This adds meaning beyond the bare parameter names.

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

Purpose4/5

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

States a specific verb and resource ('Delete multiple devices from FortiManager in bulk') and clarifies it deletes registrations, which separates it from group-membership tools like remove_devices_from_group_bulk. It does not explicitly name the sibling (delete_device) it differs from, so it stops short of a 5.

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

Usage Guidelines2/5

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

The description explains what the tool does but gives no when-to-use/when-not-to-use guidance and names no alternative such as delete_device for single-device deletion. The 'in bulk' wording implies the obvious use case, but there is no explicit routing guidance.

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

delete_device_vapA

Delete a wireless VAP from a device's device DB.

Args: device: Managed device name name: VAP object name to delete vdom: VDOM the VAP lives in (default "root")

Returns: Deletion result

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It says the VAP is deleted from the device DB and returns a deletion result, but it does not disclose irreversibility, permission needs, commit requirements, dependency checks (e.g., WTP profile assignment), or failure behavior.

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

Conciseness4/5

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

The description is short, front-loaded, and structured with Args/Returns. The 'Returns: Deletion result' line is vague and partly redundant because an output schema exists, but overall there is little waste.

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

Completeness3/5

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

The purpose and all three parameters are documented, and the output schema covers return values. However, for a destructive delete operation with no annotations, the definition omits important operational context such as prerequisites, irreversibility, and whether changes require commit.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does: it explains device as the managed device name, name as the VAP object to delete, and vdom as the VDOM with default 'root'. It could add format details for device, but otherwise all parameters are meaningfully documented.

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

Purpose5/5

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

The description states a specific verb and resource: deleting a wireless VAP from a device's device DB. This clearly distinguishes it from sibling tools such as create_device_vap and list_device_vaps.

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

Usage Guidelines3/5

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

The intended action is implied by 'Delete a wireless VAP', but there is no explicit guidance on when to use this versus alternatives, prerequisites, or warnings before deletion. The agent must infer that this is the delete counterpart to create/list VAP tools.

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

delete_device_wtpA

Delete a managed FortiAP registration from a device's device DB.

This drops the AP's reference to its wtp-profile. FortiManager prunes a wtp-profile that no wtp entry references on install (see create_device_wtp), so deleting the last AP on a profile loses that profile on the next install_device_settings.

Args: device: Managed device name wtp_id: FortiAP serial number (the wtp-id / table mkey) vdom: VDOM the AP is registered in (default "root")

Returns: Deletion result

NameRequiredDescriptionDefault
vdomNoroot
deviceYes
wtp_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the direct effect (reference dropped) and the non-obvious downstream consequence (wtp-profile pruning on the next install_device_settings), which is exactly the kind of cross-object side effect an agent needs. It omits permission requirements, idempotency, and behavior when the ID is not found.

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

Conciseness4/5

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

The purpose sentence comes first, followed by the important caveat, then a compact Args/Returns block. Slightly padded by the line-wrapped prose, but every sentence contributes information an agent needs.

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

Completeness4/5

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

An output schema exists so return format needn't be explained, and params plus side effects are covered. What remains missing is whether a commit/install step is required to apply the deletion and how to recover from an unknown wtp_id — minor but relevant for a destructive operation.

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

Parameters5/5

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

Schema description coverage is 0% (fields are bare titles like 'Wtp Id'), so the description must compensate, and it does: device is the managed device name, wtp_id is the FortiAP serial number / wtp-id table mkey, vdom is the registering VDOM with default 'root'. The clarification that wtp_id is a serial rather than a numeric ID is materially useful.

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

Purpose5/5

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

States a specific verb (delete) and a precisely scoped resource (a managed FortiAP registration from a device's device DB), which cleanly separates it from list_device_wtps, get_device_wtp, create_device_wtp and update_device_wtp in the sibling set. No ambiguity about what is being removed.

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

Usage Guidelines4/5

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

Gives clear operational context: the AP's wtp-profile reference is dropped and the profile can be pruned on the next install, and it cross-references create_device_wtp and install_device_settings. It does not tell the agent how to discover a wtp_id first (get_device_wtp / list_device_wtps) or what to do if the AP is absent, so no explicit alternatives guidance.

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

delete_dlp_profileA

Delete a DLP profile.

WARNING: This will fail if the profile is in use by policies.

Args: adom: ADOM name name: Profile name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description must carry the full safety burden. It does disclose the destructive nature and the key failure mode (profile referenced by policies) plus a return shape. It omits whether the deletion is permanent, whether an ADOM lock is required, and what permissions are needed — meaningful gaps for an unannotated delete operation.

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

Conciseness4/5

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

The purpose and the failure warning are front-loaded before the args block, so an agent reading only the first lines still gets the critical information. The Args/Returns structure is boilerplate that repeats parameter names already in the schema, costing a little space but nothing harmful.

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

Completeness3/5

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

An output schema exists, so restating return keys is redundant, and the failure warning covers the main behavioral risk. Still, for a two-parameter destructive tool with zero annotation coverage, the absence of any mention of ADOM locking, permissions, or irreversibility 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.

Parameters4/5

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

Schema description coverage is 0% (properties carry only titles "Adom" and "Name"), so the description must compensate. It does document both required parameters in plain terms (ADOM name, profile name to delete), though it adds no format examples or constraints such as case sensitivity or naming rules.

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

Purpose4/5

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

The first sentence names a specific verb+resource ("Delete a DLP profile"), which cleanly separates it from siblings like delete_webfilter_profile or delete_waf_profile by resource. It doesn't explicitly differentiate against related DLP siblings (get_dlp_profile, update_dlp_profile), but the operation is unambiguous.

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

Usage Guidelines3/5

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

The WARNING gives one important precondition (fails if in use by policies), which is real usage context. However, it never points to an alternative such as find_object_usage or get_dlp_profile to verify whether the profile is in use before attempting deletion, and no other when-to-use guidance is offered.

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

delete_dnsfilter_profileB

Delete a DNS filter profile.

WARNING: This will fail if the profile is in use by firewall policies.

Args: adom: ADOM name name: Profile name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations at all, the description carries the full burden. It discloses one important behavioral trait — the failure mode when the profile is referenced by firewall policies — which is real value. However, it omits whether deletion is irreversible, what permissions/ADOM lock state are required, and whether the object must be unassigned first.

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

Conciseness4/5

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

Front-loaded with purpose then warning, which is the right ordering for a destructive tool. The Args block is largely redundant with the schema, costing a little, but overall the description is short and every other line earns its place.

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

Completeness3/5

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

An output schema exists, so listing return keys is unnecessary duplication rather than added coverage. The main completeness gap is that a destructive, unannotated tool should say more about reversibility and how to verify the profile isn't in use before calling.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. Instead the Args block only restates the parameter names ('adom: ADOM name', 'name: Profile name to delete') with no format, casing, or scope details beyond what the schema already exposes. An agent gets no additional meaning.

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

Purpose4/5

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

States a specific verb ('Delete') and resource ('DNS filter profile'), which is unambiguous and distinct from sibling families like delete_webfilter_profile or delete_waf_profile. It does not explicitly contrast itself with those siblings or with list/get_dnsfilter_profile, but the operation is clear from the first line.

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

Usage Guidelines3/5

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

The precondition 'will fail if the profile is in use by firewall policies' is genuinely useful usage guidance, but there is no statement of when to choose deletion versus update, and no pointer to sibling tools such as find_object_usage to check references first. Usage is implied rather than instructed.

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

delete_firewall_policies_bulkA

Delete multiple firewall policies at once.

WARNING: This operation cannot be undone.

Args: adom: ADOM name package: Policy package name policyids: List of policy IDs to delete

Returns: dict: Delete result with keys: - status: "success", "partial", or "error" - deleted_count: Number of policies deleted - deleted: Policy IDs that were deleted - failed: Per-item failures [{"policyid", "message", "error_code"}, ...] - message: Status or error message

Example: >>> result = await delete_firewall_policies_bulk( ... adom="root", ... package="default", ... policyids=[5, 6, 7, 8] ... )

NameRequiredDescriptionDefault
adomYes
packageYes
policyidsYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It warns that the operation cannot be undone and provides a detailed return structure, disclosing behavioral traits beyond the input schema.

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

Conciseness5/5

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

The description is concise and well-structured with a main statement, warning, Args, Returns, and an example. Every section adds value without unnecessary text.

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

Completeness4/5

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

The description covers parameters and returns with an example, but lacks mention of prerequisites like ADOM locking or permissions. Given the output schema exists, it is fairly complete but misses minor context.

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

Parameters5/5

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

The input schema has 0% description coverage, but the description fully compensates by explaining each parameter (adom, package, policyids) with clear semantics, adding meaning beyond types.

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

Purpose5/5

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

The description clearly states the tool deletes multiple firewall policies at once, with a specific verb and resource, and distinguishes from sibling tools like delete_firewall_policy (single) and delete_devices_bulk (different resource).

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

Usage Guidelines3/5

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

The warning about irreversibility provides usage context, but the description does not explicitly state when to use this tool versus alternatives (e.g., delete_firewall_policy for single deletions), nor when not to use it.

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

delete_firewall_policyA

Delete a firewall policy.

WARNING: This operation cannot be undone.

Args: adom: ADOM name package: Policy package name policyid: Policy ID to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

The description warns that the operation cannot be undone and specifies the return format, but lacks details on idempotency, error behavior for non-existent policy, or dependencies. With no annotations, this is adequate but not comprehensive.

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

Conciseness5/5

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

The description is efficient: one sentence for the action, a warning line, and structured Args/Returns sections. No extraneous text.

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

Completeness4/5

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

The tool is simple, and the description covers purpose, irreversibility, parameters, and return structure. It could mention the need for ADOM write access or lock, but overall it is sufficient for a straightforward delete operation.

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

Parameters4/5

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

The description adds concise descriptions for each parameter (e.g., 'Policy ID to delete') which is valuable given 0% schema description coverage. It clarifies the meaning of each required parameter.

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

Purpose5/5

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

The description clearly states the action ('Delete') and the resource ('a firewall policy'), distinguishing it from sibling delete tools like delete_address or delete_device.

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

Usage Guidelines3/5

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

The description implies use for deleting a single policy by ID but does not provide explicit guidance on when to use this tool versus alternatives like delete_firewall_policies_bulk, nor does it mention prerequisites (e.g., ADOM lock).

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

delete_ips_sensorA

Delete an IPS sensor.

WARNING: This will fail if the sensor is in use by policies.

Args: adom: ADOM name name: Sensor name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses the main failure condition and return shape, but it does not state that deletion is permanent/irreversible or describe permission requirements.

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

Conciseness4/5

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

The description is short and front-loads the key warning. The Args and Returns sections are structured, though the return details are somewhat redundant because an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no annotations, the description covers the core warning, both parameters, and the return shape. It remains incomplete on irreversibility, required permissions, and what to do about policy references before deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It briefly explains both parameters as 'ADOM name' and 'Sensor name to delete,' which is adequate but adds no format, constraints, or examples beyond the parameter titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Delete an IPS sensor.' It clearly distinguishes this operation from the sibling tools create_ips_sensor, get_ips_sensor, list_ips_sensors, and update_ips_sensor.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The warning that deletion 'will fail if the sensor is in use by policies' gives a clear prerequisite/condition. It does not explicitly name alternatives or tell the agent to check dependencies first, but the operational context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_local_in_policyB

Delete an IPv4 local-in policy.

WARNING: This operation cannot be undone.

Args: adom: ADOM name package: Policy package name policyid: Local-in policy ID to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does well on the most important trait: it explicitly warns the operation cannot be undone. It also documents the return shape. It stops short of stating permission/adom-lock requirements or that changes must be committed (commit_adom) to take effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose statement is front-loaded, the destructive warning follows immediately, and the Args/Returns block is compact. The docstring scaffolding ('Args:', 'Returns:', 'dict:') is slightly ceremonial but does not obstruct reading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the duplicated Returns block is not needed for correctness, and the description covers operation, parameters, and irreversibility. It omits FortiManager-specific workflow context an agent would want — that deletion is staged and requires a commit, and what happens if the policyid does not exist — leaving a noticeable gap for a destructive operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it partially does: it glosses adom as 'ADOM name', package as 'policy package name', and policyid as 'Local-in policy ID to delete'. These add only modest meaning over the bare titles ('Adom', 'Package', 'Policyid') and give no format/validity hints such as whether policyid must reference an existing policy in that package.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (delete an IPv4 local-in policy), which lets an agent separate it from the IPv6 sibling delete_local_in_policy6 and from update/get variants. It does not explicitly name those siblings, so differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use / when-not-to-use guidance and no mention of alternatives such as delete_local_in_policy6 for IPv6 policies or the need to commit the ADOM afterwards. The only usage-relevant signal is the irreversibility warning, which is contextual rather than routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_local_in_policy6A

Delete an IPv6 local-in policy.

WARNING: This operation cannot be undone.

Args: adom: ADOM name package: Policy package name policyid: Local-in policy6 ID to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It importantly discloses that the operation is irreversible ('cannot be undone') and outlines the return shape, but it omits permission requirements, behavior when the policy ID does not exist, and any side effects on dependent objects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and irreversible warning are front-loaded, followed by a compact Args and Returns block. The Returns section duplicates an existing output schema, but overall the description is efficient and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation with an output schema already available, the description covers the core purpose, destructive warning, all parameters, and return keys. It is nearly complete, though it could note authorization or preconditions for a mutation with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It names and briefly explains all three parameters (adom, package, policyid), but the explanations are minimal and do not add format, constraints, or discovery guidance (e.g., how to obtain a valid policyid).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Delete an IPv6 local-in policy.' The IPv6 qualifier cleanly distinguishes it from the sibling delete_local_in_policy (IPv4) and other local_in_policy6 tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case is implied clearly by 'Delete an IPv6 local-in policy,' but the description never explicitly names alternatives such as update_local_in_policy6 or delete_local_in_policy, nor does it state prerequisites like needing the ADOM unlocked. The agent must infer usage from the tool name and resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_packageA

Delete a policy package.

WARNING: This will delete the package and all its policies. This operation cannot be undone.

Args: adom: ADOM name package: Package name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It explicitly warns that the package and all its policies are deleted and that the operation cannot be undone, covering the key behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the purpose and warning. The Args/Returns section is clear but adds verbosity; could be more compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with two parameters, the description covers inputs, warnings, and return format. It lacks prerequisites like ADOM lock status, but overall is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds only basic labels ('ADOM name', 'Package name to delete') without further context like format, allowed values, or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb ('Delete') and resource ('policy package'), and the warning distinguishes it from non-destructive sibling tools like `get_package` or `clone_package`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a warning about irreversibility but does not explicitly state when to use this tool versus alternatives like `delete_firewall_policy` or `update_package`. Usage context is implied but not directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_scriptB

Delete a CLI script.

Args: adom: ADOM name name: Script name to delete

Returns: Deletion result

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description only notes that it deletes a script and returns a result, but without any annotations to supplement, it fails to disclose potential side effects (e.g., irreversibility, dependencies, permission requirements). The behavioral profile is insufficient for an agent to assess risk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at two sentences plus parameter/return lines. It is front-loaded with the primary action 'Delete a CLI script' and contains no redundant information, effectively communicating the core functionality.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no annotations) and the presence of an output schema (not detailed), the description is minimally adequate. It covers the basic action and parameters but lacks context on return value structure, error conditions, or integration with other tools, leaving gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate. It identifies 'adom' as an ADOM name and 'name' as the script name, adding minimal meaning beyond the schema titles. However, no additional details like format, constraints, or examples are provided, resulting in limited added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Delete a CLI script', using a specific verb (delete) and resource (script), which clearly identifies the tool's function. Sibling tools like create_script, update_script, and get_script further distinguish it, confirming its unique purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like delete_device or delete_address. There is no mention of prerequisites, conditions, or when not to use it, leaving the agent without contextual decision support.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_sdwan_templateB

Delete an SD-WAN template.

Note: Template must not be assigned to any devices before deletion.

Args: adom: ADOM name name: SD-WAN template name

Returns: Deletion result

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It only notes the assignment precondition but omits crucial details such as irreversibility, permission requirements, error behavior when the template is still assigned, and side effects on associated configurations. This is insufficient for a deletion tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using two sentences plus a compact Args/Returns structure. Essential information is front-loaded. No unnecessary words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the basic purpose and a key precondition, but given the lack of annotations and low parameter coverage, it fails to provide sufficient behavioral context. The presence of an output schema mitigates the need for exhaustive return details, but missing ownership, error cases, and side effects leave gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. However, it merely restates the parameter names ('ADOM name', 'SD-WAN template name') without providing additional context like valid formats, constraints, or examples. The added value over the schema is minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and the resource ('SD-WAN template'), making the tool's purpose unambiguous. It is distinct from sibling tools like create_sdwan_template, assign_sdwan_template, or unassign_sdwan_template, so no confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a useful precondition ('Template must not be assigned to any devices before deletion'), but it does not provide explicit guidance on when to use this tool versus alternatives. It lacks instructions on unassigning the template first, which is a prerequisite.

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 service object.

WARNING: This will fail if the service is in use by policies.

Args: adom: ADOM name name: Service name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosure. It warns that deletion will fail if the service is in use by policies, a key behavioral trait. However, it does not mention that deletion is irreversible or any authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear purpose statement, a warning, a list of arguments, and a return value specification. Every sentence provides value without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a deletion tool with 2 parameters and an output schema (implied by the return section), the description covers the key warning and return structure. It is mostly complete, though it could benefit from mentioning permanence of the deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage. The description lists the parameters 'adom: ADOM name' and 'name: Service name to delete', adding basic clarification beyond the bare property names. This is helpful but minimal, only partially compensating for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete a service object,' which uses a specific verb and resource. This distinguishes it from sibling tools like delete_address, delete_device, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a warning about failure if the service is in use by policies, which provides some usage context. However, it does not explicitly state when to use this tool vs alternatives like delete_service_group, nor does it offer guidance on prerequisites or conditions for successful use.

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.

WARNING: This will fail if the group is in use by policies.

Args: adom: ADOM name name: Group name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the failure condition (group in use) and the return format (status/message dictionary), but lacks details on permissions, irreversibility, or side effects beyond the warning.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-liner purpose, a critical warning, then clear Args and Returns sections. Every sentence serves a purpose without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (2 simple parameters) and the presence of an output schema (emulated via the Returns block), the description covers all essential aspects: purpose, parameter semantics, failure condition, and return format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds meaning by explaining 'adom: ADOM name' and 'name: Group name to delete,' which clarifies the parameter roles beyond the schema's generic titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete a service group,' specifying the verb and resource. However, it does not distinguish from sibling tools like delete_service, which deletes individual service definitions, leaving ambiguity about when to use this tool versus alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a warning that deletion will fail if the group is in use by policies, which provides important context for when not to use the tool. However, it does not explicitly define when to use this tool or mention alternative tools for related operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_ssl_ssh_profileA

Delete an SSL/SSH inspection profile.

WARNING: This will fail if the profile is in use by policies.

Args: adom: ADOM name name: Profile name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description does the heavy lifting: it declares the operation destructive by name, discloses the specific failure mode (profile in use by policies), and documents the return keys. It stops short of stating irreversibility, ADOM lock prerequisites, or whether dependents are affected beyond blocking the delete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the WARNING are front-loaded, followed by terse Args and Returns blocks — well structured and easy to scan. The Returns section duplicates what the output schema already conveys, which is mild waste but not costly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value duplication is unnecessary, and the destructive operation lacks annotation coverage, meaning the description should say more about irreversibility and prerequisites (e.g., ADOM lock). The failure-mode warning is the one genuinely valuable addition; the rest is minimal for a delete tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning, but it only restates the schema titles: "adom: ADOM name" and "name: Profile name to delete." Neither clarifies accepted format, casing, or how to discover a valid profile name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete an SSL/SSH inspection profile") in the first line, which unambiguously separates it from siblings like get_ssl_ssh_profile, list_ssl_ssh_profiles, create_ssl_ssh_profile and update_ssl_ssh_profile. No ambiguity about what operation is performed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides one important usage condition — the call will fail if the profile is referenced by policies — which tells the agent when this call is not viable. However, it never names alternatives such as find_object_usage or list_ssl_ssh_profiles for pre-checking references, nor does it say how to resolve the in-use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_taskA

Delete a task record from FortiManager's task list.

Deletes a completed task's record, or cancels/stops a still-running one (per the How-To guide: "Deleting a task could be used to delete a completed task or cancelling/stopping a running task."). Complements list_tasks/get_task/wait_for_task in system_tools.py.

Args: task_id: Task ID number

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await delete_task(11111)

NameRequiredDescriptionDefault
task_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the critical non-obvious behavior: deleting a still-running task cancels/stops it rather than just removing a record. It also documents the return shape, though it omits irreversibility, permission requirements, and what happens to partial results of a cancelled task.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence and the dual-purpose sentence are well front-loaded, but the parenthetical How-To quote restates the sentence that precedes it verbatim in meaning, and the Returns block duplicates an output schema that already exists. Roughly a third of the text is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter deletion tool with an output schema present, the description covers purpose, dual semantics, and the destructive side effect of cancelling running tasks. Missing only operational context such as permissions, irreversibility, and error conditions for an unknown or already-completed task_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — the single task_id parameter has only a type and title. The description's "task_id: Task ID number" and the example value 11111 add marginal format context but do not compensate for the coverage gap (no source of the ID, no relation to IDs returned by list_tasks).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a task record from FortiManager's task list") and immediately clarifies the dual semantics: it removes a completed task's record or cancels/stops a running one. It also names its sibling family (list_tasks/get_task/wait_for_task), so an agent can place it precisely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes two distinct use cases (cleanup of finished tasks vs. cancelling a running task) and identifies the complementary tools. It stops short of saying when NOT to use it — e.g., prefer wait_for_task when you intend to let a job finish — so it is clear context without explicit exclusion rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_waf_profileA

Delete a WAF profile.

WARNING: This will fail if the profile is in use by policies.

Args: adom: ADOM name name: Profile name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses the key failure condition (profile in use by policies) and the return status/message, but it does not state irreversibility, required permissions, or broader side effects of deletion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads the action and warning before the Args and Returns sections. The two parameters are covered without repetition, and the return information is compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter delete operation with an output schema, the description covers purpose, the important in-use failure condition, both parameters, and return shape. It lacks permission or authorization context, but otherwise gives enough to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must supply parameter meaning. It does identify both required arguments, adom as the ADOM name and name as the profile name to delete, but it adds no format, constraints, or validation details beyond that minimum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: 'Delete a WAF profile.' That clearly distinguishes it from sibling WAF profile tools such as get_waf_profile, list_waf_profiles, create_waf_profile, and update_waf_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the operation: use this to delete an existing WAF profile. The warning that deletion fails if the profile is in use is a useful precondition, but there is no explicit guidance on when not to use it or what alternative to choose instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_webfilter_profileB

Delete a web filter profile.

WARNING: This will fail if the profile is in use by firewall policies.

Args: adom: ADOM name name: Profile name to delete

Returns: dict: Delete result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full load. It does disclose one valuable trait — deletion fails when the profile is referenced by firewall policies — but says nothing about irreversibility, required permissions, or ADOM lock state, which matter for 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then the warning, then args and returns — easy to scan. The Returns section duplicates what the output schema already declares, which is minor waste but not harmful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers inputs, a key failure condition, and the return shape, which is reasonable for a two-parameter delete. It omits the consequences of success (permanent removal, effect on the ADOM) that an agent should know before invoking a destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It names both parameters and gives minimal glosses ('ADOM name', 'Profile name to delete'), which is better than bare titles but adds no format, scope, or validation detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete a web filter profile'), which is unambiguous against siblings such as delete_dnsfilter_profile or delete_waf_profile. It does not explicitly name an alternative or scope, but the resource-specific name leaves little ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus related tools — nothing points to find_object_usage or policy_lookup to verify references, and there is no mention of prerequisites like locking the ADOM. The in-use warning hints at a pre-check but is framed as a failure mode, not a usage rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_adom_revisionA

Diff a past ADOM DB revision against the CURRENT live ADOM.

Starts a FortiManager cache-diff job (the revision as source, the live ADOM as destination), polls it to completion, and returns the summary. Read-only -- nothing is written to the ADOM.

Args: adom: ADOM name revision: Revision number to compare against current (see list_adom_revisions) timeout: Maximum wait for the diff job in seconds (default 60, capped at 300) poll_interval: Seconds between poll attempts (default 2, capped at 30)

Returns: dict: status, adom, revision, obj (object-level change summary, keyed by category), pkg (per-package change summary)

NameRequiredDescriptionDefault
adomYes
timeoutNo
revisionYes
poll_intervalNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses that a job is started, polled to completion, and that the call is read-only with nothing written to the ADOM. It also reveals blocking characteristics via timeout (default 60, capped 300) and poll_interval (default 2, capped 30). It does not state auth/permission requirements or whether the diff reflects uncommitted changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by mechanism, read-only guarantee, and structured Args/Returns. Every sentence earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what the tool does, how it behaves (job + polling), the read-only safety profile, all parameters with caps, and even summarizes the return dict keys. Complete for an agent to invoke correctly without opening the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and it does — every one of the four parameters is explained, including default values and hard caps for timeout and poll_interval, plus the cross-reference for revision. This adds substantial meaning beyond bare type/title fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Diff') and resource ('a past ADOM DB revision against the CURRENT live ADOM'), and names the underlying mechanism (FortiManager cache-diff job, revision as source, live ADOM as destination). This distinguishes it from siblings like get_adom_revision, list_adom_revisions, diff_device_revision and diff_policy_package.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Points the agent to list_adom_revisions to obtain a valid revision number, which is the key prerequisite. It does not explicitly contrast against get_adom_revision or diff_device_revision, but the 'compare against current' framing makes the use case unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_device_revisionA

Diff a past device DB revision against the CURRENT device DB.

FortiManager has no native diff endpoint for device DB revisions (unlike ADOM DB revisions -- see diff_adom_revision). This instead fetches both the past revision's config text (checkout) and the current device DB export, then computes a client-side unified line diff. Read-only.

Note: The checkout half of this requires the device to have at least one device DB revision on record -- see the note on list_device_revisions.

Args: device: Managed device name revision: Revision number to compare against current (see list_device_revisions)

Returns: dict: status, device, revision, changed (bool), diff (unified diff text, empty string if unchanged; both sides are redacted of known secret-bearing directives before diffing -- see redact_config_text_secrets -- so a line whose only change is its secret value will not show as changed)

Example: >>> result = await diff_device_revision("hub2", revision=7) >>> if result["changed"]: ... print(result["diff"])

NameRequiredDescriptionDefault
deviceYes
revisionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it declares the operation read-only, explains the client-side fetch-and-diff mechanism, and discloses the important redaction caveat that changes only to secret values will not register as changed. It also notes the missing native diff endpoint, which explains why the behavior is non-obvious.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key scope statement is front-loaded, and the Note/Args/Returns/Example structure is easy to scan. The Returns section and example add length that partly duplicates the output schema, but the redaction nuance genuinely earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-trivial diff tool with no annotations and 0% schema coverage, the description supplies mechanism, prerequisite, redaction behavior, and argument guidance, while the existing output schema covers return structure. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents both parameters: device as the managed device name and revision as the number to compare against current, with a cross-reference to list_device_revisions. It stops short of format or naming conventions, but the added meaning is substantive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb (diff) and resource (a past device DB revision vs the CURRENT device DB), and it explicitly contrasts itself with diff_adom_revision. An agent can distinguish it from sibling revision tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent to diff_adom_revision for ADOM DB revisions, points to list_device_revisions to obtain the revision argument, and states the prerequisite that at least one device DB revision must exist. When-to-use, alternatives, and precondition are all covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_policy_packageA

Diff a policy package's objects at a past ADOM revision against its CURRENT live state.

Package-level changes are tracked as part of the ADOM DB revision history, not separately, so this reuses the same cache-diff job as diff_adom_revision, scoped to one package's summary view. Read-only.

Args: adom: ADOM name package: Policy package name revision: ADOM revision number to compare against current (see list_adom_revisions) timeout: Maximum wait for the diff job in seconds (default 60, capped at 300) poll_interval: Seconds between poll attempts (default 2, capped at 30)

Returns: dict: status, adom, package, revision, summary (change summary for this package only, keyed by category -- e.g. 181 = firewall policy)

NameRequiredDescriptionDefault
adomYes
packageYes
timeoutNo
revisionYes
poll_intervalNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does so well: it declares the operation read-only, discloses that it runs an asynchronous cache-diff job with polling, and spells out the timeout (capped 300) and poll interval (capped 30) limits. It stops short of describing failure modes or job-status behavior on timeout, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core operation and the read-only guarantee, then structured into Args and Returns blocks with no filler. Slightly longer than strictly necessary given the output schema already covers returns, but every line carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero annotation coverage and zero schema description coverage, the description fills both gaps: safety profile, async job mechanics, parameter meanings with caps, and a return shape describing status/adom/package/revision/summary keyed by category. An agent has everything needed to invoke and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and it does — all five parameters are documented, including the cross-reference to list_adom_revisions for the revision value and the hard caps on timeout and poll_interval that are not visible in the schema. This adds real meaning beyond the raw types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Diff a policy package's objects at a past ADOM revision against its CURRENT live state') with the scope pinned to one package. It explicitly distinguishes itself from diff_adom_revision by explaining why it reuses that job rather than duplicating it, so an agent can tell the two siblings apart without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational context — the revision must come from list_adom_revisions and the comparison is against live state, not another snapshot. It does not state explicit when-not conditions versus diff_adom_revision, but the package-level framing already implies the selection boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_script_on_deviceA

Execute a CLI script on a specific device.

The script must have target=remote_device to run directly on the device. Script execution creates a task that should be monitored for completion.

IMPORTANT: Keep the session alive while script executes on remote devices.

Args: adom: ADOM name script: Script name to execute device: Target device name

Returns: Task ID for monitoring execution progress

NameRequiredDescriptionDefault
adomYes
deviceYes
scriptYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that a task is created, a task ID is returned, and the session must be kept alive. Missing details about failure handling, permissions, or side effects, but provides adequate transparency for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (4 sentences plus Args/Returns) with a clear structure: main action, requirement, behavioral note, important warning, and parameter list. No unnecessary words, but the Args section is as brief as the schema titles.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (script execution), the description covers the basic workflow but lacks details on prerequisites, error handling, or script availability. Output schema is not provided, but the return value (Task ID) is mentioned. More context about what ADOM is would help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no parameter descriptions in schema), so the description must compensate. It lists the three parameters (adom, script, device) with brief one-word descriptions (e.g., 'ADOM name'), but does not explain format, expectations, or how to find the script name. This adds minimal value beyond the parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Execute') and resource ('CLI script on a specific device'), and differentiates from sibling tools like execute_script_on_device_group by specifying a single device target.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: the script must have target=remote_device, and execution creates a task that should be monitored. However, it does not explicitly state when not to use this tool or compare it with siblings like execute_script_on_devices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_script_on_device_groupA

Execute a CLI script on a device group.

Args: adom: ADOM name script: Script name to execute group: Device group name

Returns: Task ID for monitoring execution progress

NameRequiredDescriptionDefault
adomYes
groupYes
scriptYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only mentions a return value (Task ID). It does not disclose behavioral traits such as whether the operation is destructive, requires special permissions, or has side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at four short lines, front-loading the action and then listing args and returns. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers parameters and return value, it omits context about execution behavior (e.g., immediate vs. queued, error handling). The presence of an output schema reduces the burden, but gaps remain for a script execution tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage (only titles like 'Adom'), but the tool description adds meaning by explaining each parameter (e.g., 'adom: ADOM name'). This provides necessary semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Execute a CLI script on a device group,' using a specific verb and resource. This distinguishes it from siblings like execute_script_on_device and execute_script_on_devices, which target different scopes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., execute_script_on_device for single devices). The description lacks context about appropriate scenarios or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_script_on_devicesB

Execute a CLI script on multiple devices.

Args: adom: ADOM name script: Script name to execute devices: List of device names

Returns: Task ID for monitoring execution progress

NameRequiredDescriptionDefault
adomYes
scriptYes
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states that the tool returns a Task ID for monitoring, implying asynchronous execution, but it does not disclose other behavioral traits such as whether it modifies state, required permissions, error handling, or limits on the number of devices.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the purpose. It uses a simple Args/Returns structure without redundancy. However, a bit more detail on parameters would not harm conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (not shown), the description appropriately mentions the return value (Task ID). However, with three required parameters and no schema descriptions, the description is minimal and could provide more context about parameters and usage flow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It only lists names (adom, script, devices) without any details on formats, constraints, or valid values. For example, it does not specify whether devices are hostnames or serial numbers, or what constitutes a valid script name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Execute a CLI script on multiple devices,' which is a specific verb-resource combination. It distinguishes from siblings like 'execute_script_on_device' (single device) and 'execute_script_on_device_group' (device group) by the plural 'devices' and the mention of multiple devices in the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this tool is for multiple devices, but it does not explicitly state when to use it versus alternatives like 'execute_script_on_device' for a single device or 'execute_script_on_device_group' for a group. No exclusions or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_script_on_packageA

Execute a CLI script against a policy package or ADOM database.

The script must have target=adom_database. This modifies the package/ADOM DB, not a live device.

Args: adom: ADOM name script: Script name to execute package: Policy package name

Returns: Task ID for monitoring execution progress

NameRequiredDescriptionDefault
adomYes
scriptYes
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden for behavioral disclosure. It states that the tool modifies the database (destructive effect) and returns a Task ID for monitoring. It does not mention permissions, error handling, or reversibility, but the disclosed behavior is adequate for a straightforward execution tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise—only four sentences plus the parameter list. It front-loads the core action and constraint, with no redundant or irrelevant information. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (3 parameters, no enums or nested objects, output schema exists), the description covers the main purpose, constraint, and return value. However, it lacks details about potential failure modes, prerequisites, or explicit async polling behavior, which would enhance completeness for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage for parameters, so the description must compensate. It lists the three parameters with brief explanations ('adom: ADOM name', etc.), which adds meaning beyond the bare names in the schema. However, it lacks format constraints, examples, or additional details that would fully compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Execute' and clearly identifies the resource 'CLI script against a policy package or ADOM database.' It distinguishes from sibling tools by specifying the target environment (package/ADOM DB) rather than live devices, which other execute_script siblings handle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit context: the script must have 'target=adom_database' and that execution modifies the package/ADOM DB, not a live device. This helps the agent decide when to use this tool versus live-device alternatives. It does not explicitly list when not to use or alternative tool names, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_duplicate_objectsA

Find objects with identical content configured under different names.

Runs FortiManager's "find duplicates" option against every object of the given type in the ADOM. FortiManager compares the requested fields across all objects of that type and adds a "duplicate entries" list to each object that shares its content with at least one other object -- the field itself, not something computed client-side.

Args: adom: ADOM name object_type: One of "address", "address_group", "service", "service_group" (default: "address") fields: Object fields to compare for duplication (e.g. ["name", "type", "subnet"] for addresses). Omit to let FortiManager use its default field set for the type.

Returns: dict: Duplicate scan result with keys: - status: "success" or "error" - object_type: The object type scanned - objects: Full per-object list FortiManager returned (each entry has a "duplicate entries" list when it has a match) - duplicate_count: Number of objects that have at least one duplicate entry - message: Error message if failed

Example: >>> result = await find_duplicate_objects("root", object_type="address") >>> for obj in result["objects"]: ... if obj.get("duplicate entries"): ... print(obj["name"], "duplicates:", obj["duplicate entries"])

NameRequiredDescriptionDefault
adomYes
fieldsNo
object_typeNoaddress

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it explains that the match is FortiManager's own 'duplicate entries' field rather than client-side computation, and that the scan runs across every object of the type. It stops short of stating that the call is read-only with no side effects, or any permission/auth prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by mechanism, Args, Returns and a short example — organized and easy to scan. It is longer than strictly necessary, and the Returns block largely duplicates the output schema, but no section is pure padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value prose is redundant, but everything an agent needs to invoke it correctly — parameters, defaults, comparison semantics — is present. Only adom identifier format and read-only confirmation are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description fully compensates: 'adom' as ADOM name, 'object_type' with its four permitted values and the 'address' default, and 'fields' with a concrete example plus the semantics of omitting it (FortiManager default field set). This is meaning well beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb+resource ('Find objects with identical content configured under different names') and scopes it to all objects of a given type in the ADOM, so the operation is unambiguous. It never names a sibling (e.g., search_objects, find_object_usage) to differentiate itself, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the use case implied and clear ('find duplicates' against an object type), but it offers no explicit when/when-not guidance and does not contrast itself with the many object-listing/search siblings in this server. An agent can infer the fit but gets no routing help.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_object_usageA

Find everywhere an ADOM object is referenced (where-used).

Runs FortiManager's cache-daemon where-used search: policies, groups, and other objects that reference the given object. This is a usage-graph lookup, distinct from object_tools.search_objects (which matches objects BY NAME, not by reference).

Args: adom: ADOM name (use "global" to search a Global ADOM object) object_name: Name of the object to trace usage for object_type: One of "address", "address_group", "service", "service_group" (default: "address") timeout: Maximum seconds to wait for the search to complete (default: 60, capped at 300) poll_interval: Seconds between progress checks (default: 2, clamped to 1-30)

Returns: dict: Usage result with keys: - status: "success" or "error" - object_name: The object searched for - object_type: The object type searched - total_matches: Number of referencing locations - used_in: List of where-used entries, each with the referencing object's root ADOM/package and the matching attr/mapping_name/mkey detail FortiManager returned - message: Error message if failed

Example: >>> result = await find_object_usage("root", "WebServer") >>> for entry in result["used_in"]: ... print(entry["root"], entry["data"])

NameRequiredDescriptionDefault
adomYes
timeoutNo
object_nameYes
object_typeNoaddress
poll_intervalNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the backing mechanism, that the operation is a cache-daemon search, timeout behavior (default 60, capped at 300) and poll_interval clamping (1-30). It never explicitly states the operation is read-only/non-mutating or what permissions are needed, which is the remaining gap for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line summary followed by mechanism, args, returns, and an example — easy to scan. The Returns block restates keys that an output schema already covers, which is mild redundancy rather than a defect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter, unannotated tool, the description covers purpose, mechanism, every parameter's semantics and constraints, and error behavior via the status/message keys. Return values are additionally backed by an output schema, so nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely, and it does: adom accepts "global" for Global ADOM objects, object_name is the traced object, object_type enumerates the four valid values with its default, and both timeout and poll_interval get defaults plus caps. This adds real meaning the bare schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Find everywhere an ADOM object is referenced (where-used)") and names the underlying mechanism (FortiManager cache-daemon where-used search). It explicitly differentiates itself from search_objects, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context ("policies, groups, and other objects that reference the given object") and explicitly contrasts with search_objects, which matches by name rather than reference. It does not address other plausible alternatives such as find_duplicate_objects or policy_lookup, so the routing guidance is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_addressA

Get detailed information about a firewall address object.

Args: adom: ADOM name name: Address object name

Returns: dict: Address details with keys: - status: "success" or "error" - address: Full address configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It states it 'gets' information, implying a read operation, but does not explicitly confirm read-only status, side effects, or authentication requirements. The return format is described, but overall behavioral context is lacking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, uses a clear docstring format with Args and Returns sections, and front-loads the purpose. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (2 params, read operation), the description covers purpose, arguments, and return values. The presence of an output schema reduces the need for detailed return documentation. However, it could mention any prerequisites or access requirements for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two required parameters with only titles. The description adds 'ADOM name' and 'Address object name', providing slight clarification over the schema. However, schema coverage is 0% according to context, so the description partially compensates but does not fully enrich parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Get detailed information about a firewall address object,' using a specific verb and resource. This clearly distinguishes it from sibling tools like list_addresses (which lists all addresses) and other get_* tools for different objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly suggests using this tool when detailed information is needed rather than just a list, but it does not explicitly state when to use it versus alternatives. No exclusions or alternative recommendations are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_address_groupB

Get detailed information about an address group.

Args: adom: ADOM name name: Address group name

Returns: dict: Group details with keys: - status: "success" or "error" - group: Full group configuration including members - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the return format and error behavior ('Error message if failed'), which is adequate for a read-only operation. However, it does not discuss permissions or potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using a structured docstring format without fluff. It efficiently conveys purpose, parameters, and return structure. No unnecessary sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 required parameters, no nested objects), the description covers purpose, parameters, and return format adequately. An output schema exists but the description still outlines return keys, adding clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains 'adom: ADOM name' and 'name: Address group name', adding essential meaning beyond the empty schema. The explanations are clear, though could be more detailed about 'ADOM'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get detailed information about an address group,' which is a specific verb+resource. However, it does not distinguish from siblings like 'get_address' or 'list_address_groups', slightly reducing clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as 'get_address' (for a single address) or 'list_address_groups'. The description lacks any context on appropriate usage scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_adomA

Get detailed information about a specific ADOM.

Args: name: ADOM name (e.g., "root", "customer-a") include_details: Include sub-objects (default: False)

Returns: dict: ADOM details with keys: - status: "success" or "error" - adom: ADOM object with full configuration - message: Error message if failed

Example: >>> result = await get_adom("root") >>> print(f"State: {result['adom']['state']}")

NameRequiredDescriptionDefault
nameYes
include_detailsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the return structure (status, adom, message) and includes an example. While it does not explicitly state read-only behavior, the verb 'Get' implies it. Describes error handling via message key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with Args, Returns, and Example sections. Every sentence adds value, and the content is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description provides additional context via an example and error handling details. For a simple 2-parameter tool, the description is complete and leaves no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does so effectively: explains 'name' with examples ('root', 'customer-a') and 'include_details' with 'Include sub-objects (default: False)'. This adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Get detailed information about a specific ADOM' using a specific verb and resource, and the tool is distinct from sibling get_* tools that target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use (to get ADOM details) but does not provide explicit when-not-to-use or alternatives. The context of sibling tools provides natural differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_adom_revisionA

Get one ADOM DB revision's metadata.

Args: adom: ADOM name revision: Revision number (the version field from list_adom_revisions)

Returns: dict: status, adom, revision (name, desc, created_by, created_time, locked, version)

NameRequiredDescriptionDefault
adomYes
revisionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description bears the full burden. 'Get ... metadata' implies a read-only, non-mutating operation, and the field list previews the shape of the result, but there is no disclosure of error behavior for a missing revision, permission requirements, or what the 'locked' field implies for follow-up actions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and the Args/Returns block is compact, with no filler. The Returns section partly duplicates what the output schema already declares, which costs a little efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema present, the description supplies what is needed to call it correctly: the purpose, both parameter meanings, the upstream source of the revision value, and the result fields. Only edge-case behavior (revision not found, locked revisions) is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning, and it does: 'adom' is identified as the ADOM name and 'revision' is tied explicitly to the `version` field returned by list_adom_revisions, which resolves the most likely agent confusion. It does not state the accepted integer format or range, keeping it short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and a precise resource ('one ADOM DB revision's metadata'), which cleanly separates it from list_adom_revisions, diff_adom_revision, and revert_adom_revision. It stops short of naming those siblings explicitly, so the differentiation relies on the agent inferring from the naming conventions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical 'the `version` field from list_adom_revisions' gives a concrete prerequisite and a chaining hint, which is genuinely useful. However, it never states when to choose this over diff_adom_revision or get_device_revision, nor any exclusions or failure conditions, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_antivirus_profileB

Get detailed information about an antivirus profile.

Args: adom: ADOM name name: Antivirus profile name

Returns: dict: Profile details with keys: - status: "success" or "error" - profile: Full antivirus profile configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the response envelope and that errors surface via status/message, which is real behavioral context, but it omits whether this is strictly read-only, what permissions are needed, and whether a missing profile raises an error or returns an empty profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and the Args/Returns layout is scannable with no filler prose. The Returns block partially duplicates the declared output schema, which is the only wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema present, the description covers the essentials: intent, both parameters, and the error envelope. It stops short of the failure-mode and permission context an agent needs when a lookup may not resolve, leaving a meaningful gap for a no-annotation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does not: 'adom: ADOM name' merely restates the schema title 'Adom', and 'name: Antivirus profile name' only slightly narrows 'Name'. Neither explains whether ADOM is the management container, whether a full path or scope prefix is accepted, or any format expectations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about an antivirus profile'), which lets an agent separate it from the mutation siblings update_antivirus_profile/delete_antivirus_profile and from list_antivirus_profiles. It never explicitly names those siblings, so the list-vs-get distinction is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the required 'name' parameter signals a single-object lookup, so an agent can infer it should call list_antivirus_profiles first and then fetch details. There is no explicit statement of when to prefer this over the list tool, nor any note on what happens if the profile does not exist in the given ADOM.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_application_listB

Get detailed information about an application-control list.

Args: adom: ADOM name name: Application-control list name

Returns: dict: List details with keys: - status: "success" or "error" - list: Full application-control list configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden; it does disclose the result envelope (status success/error, full list config, message on failure), which is useful. It does not state read-only safety explicitly, permission requirements, or behavior when the named list is absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the text is short, but the Args/Returns block restates parameter names and duplicates the return structure that an output schema already provides. The Returns section, in particular, does not fully earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool this is close to sufficient, and the return-key breakdown is redundant given an output schema exists. Missing but relevant context includes not-found behavior and any ADOM/locking preconditions, which matters for a FortiManager-style getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (only bare titles), so the description must compensate; it partly does by clarifying 'name' as the application-control list name rather than a generic name. However, 'adom: ADOM name' is essentially tautological and no format or constraint details are given for either parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('get') and resource ('application-control list') and signals 'detailed information', which implicitly distinguishes it from list_application_lists. It stops short of naming the sibling explicitly, so an agent must infer the single-item vs collection distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'get detailed information' plus a required 'name' suggests fetching one specific list, contrasted with list_application_lists. There is no explicit when-to-use, when-not-to-use, or prerequisite guidance (e.g., whether the ADOM must be locked or the list must already exist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cli_template_groupA

Get details of a CLI template group.

Args: adom: ADOM name name: CLI template group name

Returns: CLI template group details

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It correctly implies a read-only operation ('Get details') without side effects, but it does not disclose authorization requirements or any potential behavioral nuances. The description is minimal but accurate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded. It states the purpose in one line, then lists two parameters with brief explanations. Every sentence is essential, and there is no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 'get' operation, the description is complete. It identifies the required parameters and indicates a return value. Since an output schema exists, the description need not detail return fields. The tool's complexity is low, and the description covers all necessary information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema coverage is 0%, meaning the description must compensate. It adds semantic meaning by labeling the parameters as 'ADOM name' and 'CLI template group name', which clarifies their purpose beyond the schema's bare type definitions. However, it does not elaborate on expected formats or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get details of a CLI template group.' It uses a specific verb 'get' and resource 'CLI template group', and it distinguishes from sibling tools like create_cli_template_group, delete_cli_template_group, and list_cli_template_groups by its focus on fetching details of a single group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives. While the purpose is clear, there is no context about when to prefer this over list_cli_template_groups or other tools. The usage is implied but not explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_deviceA

Get detailed information about a specific managed device.

Args: name: Device name adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") include_details: Include sub-objects like VDOMs (default: False)

Returns: dict: Device details with keys: - status: "success" or "error" - device: Device object with full configuration - message: Error message if failed

Example: >>> result = await get_device("FGT-HQ", "root") >>> print(f"Version: {result['device']['os_ver']}") >>> print(f"Platform: {result['device']['platform_str']}")

NameRequiredDescriptionDefault
adomNo
nameYes
include_detailsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It correctly indicates a read operation ('Get'), but does not disclose potential side effects, permissions, or error handling beyond 'message' key. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with Args, Returns, and Example sections. Every sentence is informative, no wasted words. Front-loaded with clear purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema exists, description appropriately focuses on usage. Covers parameters sufficiently, includes example for clarity. Could mention that it requires device name, but that is implicit from required parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the tool description provides clear explanations for all three parameters: name, adom (with default behavior from env var), and include_details (sub-objects like VDOMs). Adds significant value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Get detailed information about a specific managed device', using a specific verb and resource. It distinguishes from sibling tools like list_devices and get_device_interfaces by focusing on a single device with full details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for retrieving full device details, but no explicit guidance on when to use this vs alternatives like list_devices or get_device_interfaces. Does not state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_client_locationA

Locate a client on a device (Asset Identity Center): which FortiAP / FortiSwitch + VLAN it is connected through.

Proxies the device's detected-device inventory (/api/v2/monitor/user/device/query) -- the data behind the FortiManager "Asset Identity Center" view -- and answers "where is this client connected". Each match resolves to the access point / switch + port and VLAN the client is on, plus hostname, vendor/OS, online state, DHCP lease and vuln count.

Filter to one client by ip, mac or hostname (each provided filter narrows; a hostname match is case-insensitive substring). With no filter, the full detected-client inventory is returned (summarized).

Args: adom: ADOM name (defaults to DEFAULT_ADOM / "root" when omitted) device: Managed device name (e.g. "FGT-HQ"). Defaults to DEFAULT_DEVICE when omitted; required if that is not configured. ip: Client IPv4 address to locate (exact match) mac: Client MAC address to locate (case-insensitive) hostname: Client hostname to locate (case-insensitive substring)

Returns: dict with keys: - adom, device - query: the filter used (or None for full inventory) - match_count - clients: summarized detected-client records (ap/switch/port/vlan/...) - error / error_code: on failure

NameRequiredDescriptionDefault
ipNo
macNo
adomNo
deviceNo
hostnameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden and does well: it identifies the proxied API endpoint, says each match resolves to AP/switch plus port and VLAN, and lists hostname, OS, online state, DHCP lease, and vuln count. It does not mention auth/permission requirements or rate limits, but it is far more transparent than a bare read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then organized into Args and Returns sections, which is easy to scan. It is somewhat verbose and the Returns section overlaps with the existing output schema, but the endpoint and filtering details justify most of the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter read-only lookup with 0% schema description coverage, the definition supplies defaults, filter semantics, return shape, and error keys. An agent has enough information to call it correctly without inspecting the schema or guessing at behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: adom and device defaults are explained, ip is exact-match, mac is case-insensitive, and hostname is a case-insensitive substring match. Every parameter is given meaning beyond its name and type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: locating a client on a device and reporting the FortiAP/FortiSwitch, port, and VLAN it uses. It also distinguishes the tool from general device/status siblings by tying it to the Asset Identity Center and the detected-device inventory endpoint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly explains how to narrow the query with ip, mac, or hostname and notes that omitting filters returns the full detected-client inventory. It does not explicitly compare against sibling tools, but the use case is well framed and unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_interface_configA

Read a device's interface CONFIG objects from FortiManager's device DB.

Unlike get_device_interfaces (which proxies the live FortiGate monitor API and cannot filter by VLAN), this reads the interface configuration FortiManager keeps in its device database and supports server-side filtering by VLAN id and/or exact interface name. Use it to map a queried IP / client to the VLAN, interface and physical port it belongs to.

Args: device: Managed device name (e.g. "FGT-HQ"). Defaults to DEFAULT_DEVICE when omitted; required if that is not configured. vlanids: Optional list of VLAN ids to filter on (matches vlanid in) name: Optional exact interface name to filter on (e.g. "port1")

Returns: dict with keys: - device - interfaces: raw device-DB interface config (list or dict), credential fields stripped -- see _INTERFACE_SECRET_FIELDS - summary: condensed per-interface list (name/alias/vlanid/ip/...) - interface_count: number of summarized interfaces - error / error_code: on failure

NameRequiredDescriptionDefault
nameNo
deviceNo
vlanidsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load and does well: it discloses the data source (device DB vs live API), server-side filtering behavior, credential-field stripping, and the presence of error/error_code on failure. It stops short of mentioning permission requirements or whether the read is cached/stale, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and sibling differentiation are front-loaded in the first two sentences, and each subsequent sentence adds information. The Returns block partially duplicates the existing output schema, which is modest waste, though the Args block earns its space given 0% schema coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, 3-optional-parameter tool with an output schema, the description covers everything an agent needs: what it reads, where the data comes from, how it differs from the alternative sibling, how each filter behaves, and how errors surface. No significant gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: device is documented with its DEFAULT_DEVICE fallback and the case where it becomes required, vlanids with its 'vlanid in' matching semantics, and name as an exact-match filter. All three parameters gain meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — reading interface CONFIG objects from FortiManager's device DB — and immediately contrasts it with the sibling get_device_interfaces, which proxies the live monitor API. An agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative (get_device_interfaces) and the condition that separates them (device DB vs live monitor API, VLAN filtering support). It also supplies a concrete use case: mapping a queried IP/client to VLAN, interface and physical port.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_interfacesA

Get interface information from a managed device.

Queries the actual device through FortiManager proxy to get current interface configuration and status.

Args: adom: ADOM name device: Device name

Returns: dict: Interface information with keys: - status: "success" or "error" - data: Interface list from FortiGate API - message: Error message if failed

Example: >>> result = await get_device_interfaces("root", "FGT-HQ") >>> for iface in result['data']: ... print(f"{iface['name']}: {iface.get('ip')}")

NameRequiredDescriptionDefault
adomYes
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It mentions querying the device through proxy and describes the return format, but does not explicitly state it is read-only or discuss latency or permissions, which would be helpful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (summary, Args, Returns, Example) and front-loaded purpose. It is slightly lengthy but every part contributes value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool, the description covers purpose, parameters, return format, error handling, and an example. With an output schema present, the return description is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description provides clear descriptions for both parameters ('adom: ADOM name', 'device: Device name') and includes an example usage, adding significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get interface information from a managed device.' It specifies the verb and resource, and distinguishes itself from sibling tools by explaining it queries the actual device through FortiManager proxy for current configuration and status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when to use the tool (to get live interface data) and includes an example. While it does not explicitly exclude alternatives, the focus on real-time query differentiates it from other get/list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_ipsec_phase1_interfaceA

Get one IPsec phase1-interface (remote gateway) from a device's device DB.

Args: device: Managed device name name: Phase1-interface (remote gateway) name vdom: VDOM it lives in (default "root")

Returns: dict with device, vdom and the stored object (credential fields stripped -- see _PHASE1_SECRET_FIELDS), or a not_found error

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does meaningful work: it discloses that credential fields are stripped (referencing _PHASE1_SECRET_FIELDS) and that a not_found error is a possible outcome. It does not cover permissions or whether a stale device DB read can occur, but the disclosure of redaction and failure mode is well beyond a bare read description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, followed by compact Args/Returns blocks. Every line carries information; the '_PHASE1_SECRET_FIELDS' internal identifier is mildly implementation-leaking but signals the redaction is systematic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the Returns section is somewhat redundant, but it usefully adds the not_found failure case and the credential-stripping guarantee that a schema alone would not convey. Combined with full parameter documentation, an agent has enough to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: device is 'Managed device name', name is the 'phase1-interface (remote gateway) name', and vdom is the VDOM it lives in with default 'root'. All three parameters get meaning, though none get format examples or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Get one IPsec phase1-interface (remote gateway) from a device's device DB', where 'one' distinguishes it from the sibling list_device_ipsec_phase1_interfaces. It does not name the sibling explicitly, so differentiation requires the agent to infer it from the name pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'one' signals single-object retrieval versus the list sibling, and the required device+name pair signals lookup by identity. There is no explicit 'use this when...' statement, no mention of a create/update/delete counterpart, and no prerequisites such as whether the device must be managed or locked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_ipsec_phase2_interfaceA

Get one IPsec phase2-interface (tunnel/selector) from a device's device DB.

Args: device: Managed device name name: Phase2-interface (tunnel) name vdom: VDOM it lives in (default "root")

Returns: dict with device, vdom and the stored object, or a not_found error

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the return shape ('dict with device, vdom and the stored object') and the failure mode ('not_found error'), which is genuinely useful, but it never states that this is a read-only operation or whether any locking/permission context applies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by tight Args and Returns blocks; every line adds information and nothing is repeated from structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-object fetch with an output schema present, the definition covers inputs and the error case adequately. Missing only minor details such as whether the name lookup is vdom-scoped or global, but the overall picture is sufficient to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all three params (device, name, vdom) are explained, including the default for vdom. The explanations are terse ('Managed device name') without format examples, which keeps it below a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one IPsec phase2-interface (tunnel/selector) from a device's device DB') and the parenthetical clarifies the domain concept. The 'one' quantifier implicitly separates it from the sibling list_device_ipsec_phase2_interfaces, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the singular-object framing; nothing states when to use this versus the list, create, update, or delete phase2-interface siblings. The Args section gives retrieval inputs but no contextual conditions or prerequisites (e.g., device must be managed/adopted).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_realtime_statusA

Get real-time status from a managed device.

Queries the actual device through FortiManager proxy to get current system status including CPU, memory, and uptime.

Args: adom: ADOM name device: Device name

Returns: dict: Real-time status with keys: - status: "success" or "error" - data: Device status from FortiGate API - message: Error message if failed

Example: >>> result = await get_device_realtime_status("root", "FGT-HQ") >>> print(f"Uptime: {result['data'].get('uptime')}")

NameRequiredDescriptionDefault
adomYes
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full disclosure burden. It reveals that the tool queries the actual device through FortiManager proxy, returns success/error status, and includes error messages. However, it does not discuss potential slowness, permissions, or rate limits, which would elevate it to a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening, separate sections for args, returns, and an example. Every sentence is necessary, and the front-loaded purpose sentence immediately conveys the tool's function. No superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, no nested objects) and the presence of an output schema, the description sufficiently covers behavior, return format, and error handling. The example further clarifies usage, making it complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions (0% coverage), but the description's 'Args' section provides brief yet meaningful definitions: 'adom: ADOM name', 'device: Device name'. This adds value beyond the schema's bare types, though more detail (e.g., valid patterns) would be beneficial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get real-time status from a managed device' via FortiManager proxy, specifying real-time data like CPU, memory, uptime. This distinguishes it from sibling tools like get_device_status or get_system_status by emphasizing the real-time, proxy-mediated nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for obtaining current device status but lacks explicit guidance on when to use this tool versus alternative status tools (e.g., get_device_status) or when not to use it. It does not mention prerequisites or limitations, leaving the agent to infer usage from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_revisionA

Check out one device DB revision's stored configuration text.

Note: Requires the device to have at least one device DB revision on record -- see the note on list_device_revisions.

Args: device: Managed device name revision: Revision number (see list_device_revisions), or -1 (default) for the latest revision

Returns: dict: status, device, revision, content (device DB config text with known secret-bearing directives redacted -- see redact_config_text_secrets. Structured dict-field masking elsewhere in this codebase can't see inside this multi-line CLI text, so this applies a separate directive-name-based redaction.)

Example: >>> result = await get_device_revision("hub2", revision=8) >>> print(result["content"])

NameRequiredDescriptionDefault
deviceYes
revisionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses that secret-bearing directives in the returned text are redacted via a separate directive-name-based mechanism, and even explains why structured masking is insufficient. It does not cover permissions or behavior when the revision doesn't exist, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then clearly sectioned into Note/Args/Returns/Example. The redaction parenthetical is somewhat long but explains a non-obvious behavior, so it earns most of its space; the code example is a marginal addition given the Args/Returns sections already state the shape.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description goes beyond requirements by describing the redaction semantics of the returned content and the prerequisite condition. What remains unstated is failure behavior for a nonexistent revision number, which is a minor gap for a read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: 'device' is defined as a managed device name and 'revision' as a revision number from list_device_revisions, with -1 (default) explicitly meaning latest. Only format/syntax detail (e.g. type of device identifier) is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: retrieving the stored configuration text of one device DB revision. It is clearly distinguishable from list_device_revisions (which enumerates revisions) and diff_device_revision (which compares them).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the prerequisite (device must have at least one DB revision, pointing to the note on list_device_revisions) and explains that revision numbers come from that same tool, with -1 meaning latest. No explicit when-not guidance versus diff_device_revision, but the retrieval vs comparison split is implicit and clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_sdwanA

Get a managed device's SD-WAN configuration from FortiManager's device DB.

Unlike get_sdwan_template (which reads wanprof templates in an ADOM), this reads the SD-WAN config local to the device itself -- members/zones, health-checks and service (steering) rules -- from the device database FortiManager keeps in sync with the FortiGate. Use this when a device runs SD-WAN but has no wanprof template assigned (list_sdwan_templates returns nothing) yet you still need its members, zones and steering rules.

Args: device: Managed device name (e.g. "myfw01") vdom: VDOM name (default: "root")

Returns: dict with keys: - device, vdom - sdwan: raw system/sdwan config object - summary: condensed members/zones/health-checks/service rules - error / error_code: on failure

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden; it discloses that this is a read of the device DB, what config areas are covered (members/zones, health-checks, service rules), and that failures surface as error/error_code keys. It does not state permission requirements or behavior when the device has no SD-WAN config at all, leaving a small gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the sibling distinction are front-loaded in the first paragraph, with usage guidance before the Args block. The Returns section largely duplicates the existing output schema, which is mild waste, but the text is organized and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the return listing is redundant but harmless; the description covers what it reads, when to use it versus template tools, both parameters, and error keys. The only real gap is behavior when the device has no local SD-WAN config.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it documents both params -- device as the managed device name with an example ("myfw01") and vdom with the default "root". That is meaningful added semantics over the bare schema, though it omits whether vdom accepts non-root values or how to discover them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and scope: reads a managed device's SD-WAN config from FortiManager's device DB, and explicitly contrasts it with get_sdwan_template reading wanprof templates in an ADOM. An agent can distinguish it from the SD-WAN template siblings without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (get_sdwan_template) and the exact selecting condition: use this when a device runs SD-WAN but has no wanprof template assigned, evidenced by list_sdwan_templates returning nothing, yet members/zones/steering rules are still needed. Explicit when-to-use and when-to-prefer-a-sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_sdwan_monitorA

Read a device's LIVE SD-WAN Monitor status through the FortiManager proxy.

Unlike get_device_sdwan (which reads the device-DB SD-WAN config), this proxies the device's live monitor API to return current SD-WAN runtime state -- the data the FortiManager "SD-WAN Monitor" view shows:

  • per-member link status and up/down bandwidth (virtual-wan/members)

  • per-member SLA health for each health-check: latency, jitter, packet loss and which SLA targets are met (virtual-wan/health-check)

Use it to answer "how are the uplinks doing right now / which member is breaching SLA", which the config read cannot answer.

Args: adom: ADOM name (defaults to DEFAULT_ADOM / "root" when omitted) device: Managed device name (e.g. "FGT-HQ"). Defaults to DEFAULT_DEVICE when omitted; required if that is not configured.

Returns: dict with keys: - adom, device - members: raw virtual-wan/members proxy response - health_check: raw virtual-wan/health-check proxy response - summary: condensed member links/bandwidth + per-member SLA - error / error_code: on failure

NameRequiredDescriptionDefault
adomNo
deviceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it explains that the call proxies the live device monitor API through FortiManager (implying a managed, reachable device), enumerates the two proxied endpoints fetched, and names the return keys including error/error_code. It stops short of stating failure modes such as an offline device or permission requirements, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb/resource and the key contrast before the endpoint bullet list and Args/Returns blocks. Reasonably efficient, though the Args/Returns docstring sections partially restate structured fields and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter read tool this covers the essential gaps left by an annotation-free, description-less schema: what is fetched, the two data sections, the summary key, and error handling. The Returns section duplicates the existing output schema, which is mild redundancy rather than a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: it documents that adom defaults to DEFAULT_ADOM/'root' and device defaults to DEFAULT_DEVICE, plus a concrete example name and the case where device becomes required. Only the expected format/validation of adom names is left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and resource (device's LIVE SD-WAN Monitor status) and explicitly contrasts itself with the sibling get_device_sdwan, which reads config rather than runtime state. An agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (get_device_sdwan) and the condition that selects it — config vs runtime state — and gives a concrete user question ('how are the uplinks doing right now / which member is breaching SLA') that only this tool answers. Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_sslvpn_settingsA

Get the SSL-VPN (Agentless VPN) settings object from a device's device DB.

This is a per-vdom singleton -- there is exactly one, so no list/create/ delete tools exist for it, matching the FNDN schema's "object" (not "table") classification.

Args: device: Managed device name vdom: VDOM to read (default "root")

Returns: dict with device, vdom and the stored settings object

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose meaningful traits: the data source is the device DB, the object is a per-vdom singleton (so no list semantics apply), and the vdom defaults to root. It omits error behavior for an unknown device/vdom and any permission or ADOM-lock prerequisites, which is the only real gap for a read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Docstring layout is front-loaded and scannable, with the purpose in the first sentence and args/returns below. The aside about the FNDN schema's 'object' vs 'table' classification is mildly esoteric but does justify the absence of sibling CRUD tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the stated return shape (device, vdom, settings object) is a bonus rather than a necessity. For a two-parameter read tool the description covers purpose, scope, defaults, and output; only failure modes and permission prerequisites are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by documenting both parameters ('device: Managed device name', 'vdom: VDOM to read (default "root")'). It does not add accepted value formats or naming examples for vdom beyond the default, so it falls short of fully replacing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the SSL-VPN (Agentless VPN) settings object from a device's device DB'), and the clause about being a per-vdom singleton with no list/create/delete siblings distinguishes it from get_device_sslvpn_web_portal and update_device_sslvpn_settings. An agent can identify the target resource without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the context that selects this tool: it is a per-vdom singleton, so reads are the only operation and no list/create/delete variants exist. It does not explicitly name update_device_sslvpn_settings as the mutation counterpart, so routing guidance 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.

get_device_sslvpn_web_portalA

Get an SSL-VPN web portal from a device's device DB.

Args: device: Managed device name name: Web portal name vdom: VDOM it lives in (default "root")

Returns: dict with device, vdom and the stored portal object (bookmark credentials stripped -- see _PORTAL_SECRET_FIELDS), or a not_found error

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose two non-obvious behaviors: bookmark credentials are stripped from the portal object (referencing _PORTAL_SECRET_FIELDS) and a not_found error is returned when absent. It omits whether read permission on the device/ADOM is required, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-sentence purpose followed by compact Args and Returns blocks; every line adds information an agent needs, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A three-parameter getter with an output schema and no annotations is well covered: purpose, parameter meanings, return shape, and the not_found failure mode are all stated. Only prerequisite/permission context and pointer to the update sibling are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the Args block documents all three parameters beyond their names: device is a managed device name, name is the web portal name, and vdom is the VDOM it lives in with a 'root' default matching the schema. It does not state name-matching semantics (exact vs. case sensitivity), a minor residual gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get an SSL-VPN web portal') and scopes it to a device's device DB, which distinguishes it from the sibling update_device_sslvpn_web_portal and from get_device_sslvpn_settings. It does not name those siblings explicitly, so differentiation requires inference from the pair name/verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the read verb and the required device/name pair, and the 'device DB' scoping hints at which store the lookup targets. There is no explicit when-to-use/when-not guidance and no routing to related tools such as the update variant or list tools for enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_statusA

Get device status including connection and config sync status.

Returns status information for all devices or a specific device:

  • Connection status (up/down)

  • Config sync status (in_sync/out_of_sync)

  • DB status (modified/no_changes)

  • Device status (installed/checkedin/etc.)

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") device: Specific device name (optional, returns all if not specified)

Returns: dict: Device status with keys: - status: "success" or "error" - count: Number of devices - devices: List of device status objects - message: Error message if failed

Example: >>> # Get all device status >>> result = await get_device_status("root") >>> for dev in result['devices']: ... print(f"{dev['name']}: {dev['conn_status_str']}")

>>> # Get specific device status
>>> result = await get_device_status("root", "FGT-HQ")
NameRequiredDescriptionDefault
adomNo
deviceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description bears full burden. It describes the return structure (dict with status, count, devices, message) and gives example usage. It implies a read-only operation but doesn't explicitly state side effects or auth needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with bullet points and docstring-style details. It is slightly lengthy but front-loaded with purpose. Could be trimmed, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema exists, description explains return values effectively. For a tool with two optional parameters, it covers usage, defaults, and return format comprehensively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must compensate. It explains both parameters: adom (default from env var or 'root') and device (optional, returns all if not given). This adds meaning beyond the schema's bare structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves device status including connection and config sync status. It lists specific status fields and distinguishes from sibling tools like get_device_realtime_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to get status for all devices or a specific device via the 'device' parameter, and mentions the 'adom' default. However, it lacks explicit guidance on when to use this tool versus alternatives like get_device or get_device_realtime_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_wtpA

Get one managed FortiAP by wtp-id (serial number).

Args: device: Managed device name wtp_id: FortiAP serial number (the wtp-id / table mkey) vdom: VDOM the AP is registered in (default "root")

Returns: dict with device, vdom and the stored wtp object (credential fields stripped -- see _WTP_SECRET_FIELDS), or a not_found error if it does not exist

NameRequiredDescriptionDefault
vdomNoroot
deviceYes
wtp_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does add real behavioral detail: credential fields are stripped from the stored object, and a missing AP yields a not_found error rather than an exception or empty result. Read-only intent is implied by 'Get' but never stated outright.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Opens with the one-line purpose, then structured Args and Returns blocks; each line carries information. The prose-wrapped Returns paragraph is slightly longer than needed, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-object read with three required-ish parameters, the definition covers identity, scoping default, response shape, and failure mode. Since an output schema exists, the Returns section is a bonus rather than a requirement, so remaining gaps (permissions, read-only confirmation) are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must do the work, and it defines all three parameters: device as the managed device name, wtp_id as the FortiAP serial / table mkey, and vdom as the registration VDOM defaulting to 'root'. It adds meaning the bare schema titles ('Wtp Id', 'Vdom') do not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one managed FortiAP by wtp-id (serial number)') and clarifies what wtp-id actually is, which an agent could not infer from the name. It doesn't explicitly contrast itself with the sibling list_device_wtps, so the singular/plural split is only implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by 'Get one ... by wtp-id' and the not_found case. There is no statement of when to prefer this over list_device_wtps (to enumerate) or get_device_wtp_profile (to read the profile), and no prerequisites for the device/vdom lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_wtp_profileA

Get a FortiAP (WTP) profile from a device's device DB, radios included.

Args: device: Managed device name profile: FortiAP (WTP) profile name vdom: VDOM the profile lives in (default "root")

Returns: dict with device, vdom and the stored profile object (credential fields stripped -- see _WTP_PROFILE_SECRET_FIELDS), or a not_found error if the profile does not exist

NameRequiredDescriptionDefault
vdomNoroot
deviceYes
profileYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does well: it discloses that radios are included, credential fields are stripped, and a not_found error is returned when the profile is absent. It could say more about whether this is strictly read-only or what other errors may occur, but the important behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose, then uses a clean Args/Returns structure. It is slightly formulaic but every sentence adds useful information and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple read operation, and the description covers purpose, all parameters, return shape, and the key not_found behavior. Since an output schema exists, it does not need to exhaustively enumerate return fields, and it supplies the important secrets-stripping note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must supply parameter meaning. It documents all three parameters, clarifying that device is a managed device name, profile is a FortiAP/WTP profile name, and vdom defaults to 'root'. That fully compensates for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource ('Get a FortiAP (WTP) profile') and adds scope ('from a device's device DB, radios included') that separates it from sibling tools like list_device_wtp_profiles and get_device_wtp. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the lookup-by-name operation for a device-local WTP profile, but it never explicitly states when to use it instead of list_device_wtp_profiles, get_device_wtp, or update_device_wtp_profile_radio. The scope is clear enough to infer usage, but no alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dlp_profileB

Get detailed information about a DLP profile.

Args: adom: ADOM name name: DLP profile name

Returns: dict: Profile details with keys: - status: "success" or "error" - profile: Full profile configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the burden. It usefully discloses the failure path (a status field and an error message) for what is implicitly a read-only lookup, but says nothing about whether the profile must pre-exist, what permissions are needed, or how missing objects are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and the docstring layout is compact. The Returns block is somewhat redundant given an output schema exists, but the total length is modest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't enumerate return keys, yet it spends roughly half its text doing so while omitting the more valuable context: relationship to list/create/update/delete_dlp_profile siblings and error conditions. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only offers near-tautological glosses: "adom: ADOM name" and "name: DLP profile name," which add essentially nothing beyond the schema titles "Adom" and "Name." It does not clarify ADOM scoping semantics, name-matching expectations, or case sensitivity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Get detailed information about a DLP profile") that an agent can immediately act on. It does not explicitly distinguish itself from the nearby list_dlp_profiles sibling, but "detailed information" plus the required name parameter makes the single-object scope inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent infers it should call this when it already knows the ADOM and profile name, versus list_dlp_profiles for enumeration. No explicit when-to-use, prerequisites, or named alternative is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dnsfilter_profileB

Get detailed information about a DNS filter profile.

Args: adom: ADOM name name: DNS filter profile name

Returns: dict: Profile details with keys: - status: "success" or "error" - profile: Full DNS filter profile configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return envelope (status/profile/message), which implies a success/error pattern, but says nothing about read-only nature, ADOM scoping or permission requirements, or what happens when the profile does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and the Args/Returns blocks are compact and scannable. Slight waste in restating the parameter names that already appear in the schema, but nothing serial or bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool the core is present, and the presence of an output schema means return values need not be fully restated. Still missing are prerequisites (profile must already exist in the specified ADOM) and any failure semantics beyond a generic 'message' key.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it does document both parameters minimally ('adom: ADOM name', 'name: DNS filter profile name'). However, it adds no format, allowed-value, or lookup guidance (e.g., how to discover valid ADOM names), so the compensation is only partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about a DNS filter profile'), which lets an agent distinguish it from list_dnsfilter_profiles and the create/update/delete siblings on the same resource. It stops short of naming a sibling explicitly, so it does not reach 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the required `name` argument and the word 'detailed' suggest this is for inspecting an existing profile rather than enumerating them, but there is no explicit statement of when to use this versus list_dnsfilter_profiles or how to obtain a valid `name`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firewall_policyA

Get detailed information about a specific firewall policy.

Args: adom: ADOM name package: Policy package name policyid: Policy ID number

Returns: dict: Policy details with keys: - status: "success" or "error" - policy: Full policy configuration - message: Error message if failed

Example: >>> result = await get_firewall_policy("root", "default", 1) >>> print(f"Policy name: {result['policy']['name']}")

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes the return format and mentions error messages, but does not explicitly state that the tool is read-only, idempotent, or any authentication requirements. It is moderately transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: description, Args, Returns, Example. It is concise with no unnecessary words, and the purpose is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (as noted in context), the description covers return values and error handling. It includes an example. However, it does not mention behavior when the policy does not exist, which is a minor gap for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds meaning by listing parameters with brief descriptions in the Args section. It also provides an example with concrete values, making the parameter usage clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get detailed information about a specific firewall policy.' It clearly identifies the verb (get), resource (firewall policy), and specificity (by adom, package, policyid). This distinguishes it from sibling tools like 'list_firewall_policies' and 'search_firewall_policies'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'list_firewall_policies' or 'search_firewall_policies'. It does not specify prerequisites, context, or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firmware_upgrade_pathA

Preview the multi-step firmware upgrade path to a target version.

Non-destructive: internally forces flags="f_preview" so FortiManager returns the intermediate versions it would step the device through without starting an upgrade. Some FortiOS upgrades cannot jump directly to the target release and must pass through intermediate builds first; this shows that path before you call upgrade_device_firmware.

Args: device: Managed device name target_version: Target firmware version, e.g. "7.2.9-b1688" adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") vdom: VDOM to scope the request to (optional)

Returns: dict: Upgrade path with keys: - status: "success" or "error" - upgrade_path: List of version strings FMG would step through - message: Error message if failed

Example: >>> result = await get_firmware_upgrade_path("FGT-HQ", "7.2.9-b1688") >>> print(result["upgrade_path"]) ['6.0.8-303', '6.2.4-1112', '7.2.9-1688']

NameRequiredDescriptionDefault
adomNo
vdomNo
deviceYes
target_versionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does well: it declares the call non-destructive and reveals the internal mechanism (forces flags="f_preview") so the agent knows no upgrade is started. It also documents the error shape. It stops short of stating required permissions or whether the preview has any cost/latency, which keeps it off a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The non-destructive preview and the 'call this first' routing are front-loaded where the agent will read them. The Args/Returns blocks partly restate the schema and the output schema, but the worked example with a concrete upgrade_path value earns its space. Slightly longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter read-only preview tool this is complete: mechanism, side-effect profile, parameter meanings, and an example call/result. An agent has everything needed to invoke it correctly and to interpret the returned upgrade_path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all four parameters are explained, including the version string format ("7.2.9-b1688"), the ADOM default resolution chain (DEFAULT_ADOM env var, then "root"), and that vdom is optional scoping. That is meaning well beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line gives a specific verb and resource ("Preview the multi-step firmware upgrade path") and scopes it to a target version. It explicitly distinguishes itself from the sibling that actually performs the change, upgrade_device_firmware, so an agent can pick between them without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is stated as a rule, not a hint: call this before upgrade_device_firmware when a release may not be directly reachable. The description also explains why the path matters (some FortiOS upgrades cannot jump directly), which gives the agent the condition that selects this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firmware_upgrade_reportA

Get the firmware upgrade report for a device under a named profile.

Reports per-step upgrade results (health checks, package status, timestamps) for an upgrade run tracked under profile_name. The How-To Guide separately lists a "get upgrade history" question but marks it TBD with no confirmed distinct endpoint -- it speculates the same URL this wraps, so no separate history tool is provided; this is the one confirmed endpoint for both purposes.

profile_name must be a firmware upgrade profile FortiManager already knows about (e.g. one created through the GUI's Firmware Upgrade wizard, or the auto-created Firmware Template "key" a /um/image/upgrade/ext-style upgrade returns -- not something this module generates on its own).

Args: device: Managed device name profile_name: Firmware upgrade profile name to report on adom: ADOM name (default: from DEFAULT_ADOM env var, or "root")

Returns: dict: Upgrade report with keys: - status: "success" or "error" - report: Raw report data (nested per-device task/step details) - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
deviceYes
profile_nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden and does reasonably well: it frames this as a reporting/read operation, states the profile must pre-exist and is not auto-generated by this module, and gives the return shape including status/report/message and the failure path. It does not mention permissions or how long a run must exist before a report is available, which would complete the picture for a mutation-adjacent toolchain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, but the middle paragraph spends roughly half its length on meta-commentary about a How-To Guide entry marked TBD and why no history tool exists. That justification has some value for disambiguation, yet it is verbose and could be compressed to one clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Purpose, prerequisites, all three parameters, and return keys are covered, so an agent can invoke it correctly. An output schema exists, making the detailed Returns block somewhat redundant. The remaining gap is behavioral rather than informational: nothing about read-only semantics or auth/permission expectations for an unannotated tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: an Args block defines device, profile_name, and adom, including the adom default resolution (DEFAULT_ADOM env var, else 'root'). The profile_name origin constraint is substantive semantic information absent from the schema. 'device: Managed device name' is the thinnest entry but adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the firmware upgrade report') scoped to a device under a named profile, and explicitly separates it from the firmware workflow siblings (upgrade_device_firmware, get_firmware_upgrade_path, list_firmware_images) by describing the output as per-step upgrade results for a tracked run. The note about the hypothetical 'upgrade history' endpoint further pins down what this tool is and is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the precondition that profile_name must already be a firmware upgrade profile known to FortiManager (GUI wizard or the Firmware Template key returned by an ext-style upgrade), which tells the agent when this call can succeed. It also resolves the alternative — the How-To Guide's 'get upgrade history' question is unconfirmed and maps to this same endpoint, so there is no sibling to route to. No explicit when-not-to-use beyond that.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fmg_licenseA

Get the FortiManager license/contract status.

Returns the FortiManager's own license contract details (support entitlements, expiry dates, serial number) -- not managed-device licensing.

Returns: dict: License result with keys: - status: "success" or "error" - license: License data (contract list, count) - message: Error message if failed

Example: >>> result = await get_fmg_license() >>> print(result["license"]["contract"][0]["serial"])

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the return shape (status/license/message keys) and gives a working example, which is useful context for a zero-parameter call. It says nothing about authentication requirements, permissions, or whether the call is cached or rate-limited, so it is only partially complete on behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence and the scope disclaimer are front-loaded and earn their place, but the subsequent "Returns" docstring block and the `>>>` example are formatted for source-code readers rather than an agent, and the return keys are already captured by the output schema. Roughly a third of the text is redundant scaffolding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a zero-parameter tool with an output schema and no annotations, the description supplies everything needed to call it correctly: purpose, scope boundary, and a usage example. The only gap is operational context (auth/permissions), which is not covered anywhere else either.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case; there is nothing to document and the schema is fully covered. The description correctly reflects this by showing a no-argument invocation in the example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get the FortiManager license/contract status") and immediately disambiguates the scope: it returns the FortiManager's own contract details, not managed-device licensing. An agent can tell what it retrieves and what it does not without consulting any other field.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The negative scope statement ("-- not managed-device licensing") gives a clear condition for when this tool is the wrong choice, which is genuinely useful in a catalog of 200+ device/policy tools. However, it names no alternative tool for the managed-device case, so the routing guidance stops short of explicit sibling differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ha_statusA

Get FortiManager High Availability (HA) health.

Returns what FortiManager reports at /sys/ha/status. On a standalone unit that is the HA health alone, {"HA Health Status": "OK"} (measured on 7.6.8 and 8.0.2): no HA mode, no peer list and no primary/secondary role. The HA mode is in get_system_status, under "HA Mode".

Returns: dict: HA status with keys: - status: "success" or "error" - data: The HA status FortiManager returned - message: Error message if failed

Example: >>> result = await get_ha_status() >>> print(result["data"].get("HA Health Status"))

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose useful behavior: read-only fetch, standalone-unit output being just `{"HA Health Status": "OK"}` with no mode/peer/role, and version-specific observations (7.6.8, 8.0.2). It does not mention error conditions beyond a `message` key, auth requirements, or rate limits, so transparency is good but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and endpoint, then the standalone-unit caveat, then the sibling pointer. The Returns block and code example partially duplicate the output schema's job, adding some length, but each part remains scannable and on-topic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value detail is redundant-but-harmless; the description still adds real value by showing the minimal standalone payload and by naming where HA mode actually lives. Nothing critical is missing for a zero-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the example shows a no-argument invocation, so there is nothing to disambiguate. Baseline 4 applies; no parameter meaning is left unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Get FortiManager High Availability (HA) health") and pins down the exact endpoint `/sys/ha/status`. It also distinguishes itself from the closest sibling by noting that HA mode lives in get_system_status under "HA Mode", so an agent can choose correctly without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear routing rule: use this for HA health, use get_system_status for HA Mode. It does not spell out explicit when-not conditions or prerequisites (e.g. no HA configured, permissions), but the single relevant alternative is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ips_sensorB

Get detailed information about an IPS sensor.

Args: adom: ADOM name name: IPS sensor name

Returns: dict: Sensor details with keys: - status: "success" or "error" - sensor: Full sensor configuration, including its "entries" list of signature filters/overrides - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the return shape (status/sensor/message), including that 'entries' holds signature filters/overrides, but says nothing about permissions, error cases beyond a 'message' key, or whether the ADOM must be locked or the sensor must already exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Docstring-style Args/Returns layout is front-loaded and easy to scan, with the purpose in the first line. The Returns section is slightly redundant given an output schema exists, but nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema, the essential contract is present. What is missing is how to obtain a valid ADOM/sensor name and what happens on failure, which matters more here because there are no annotations to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the schema only exposes bare property names 'adom' and 'name'. The Args block restates them as 'ADOM name' and 'IPS sensor name' — a marginal gloss that gives no format, case, or lookup guidance to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get detailed information about an IPS sensor.' It is clearly distinguishable by verb from create/update/delete/list_ips_sensor siblings, but it never names those siblings or scopes the difference explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance at all: no mention of list_ips_sensors as the way to discover a sensor name, no prerequisites, and no conditions under which this tool should be preferred over inspecting a sensor via another route.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_local_in_policyB

Get detailed information about a specific IPv4 local-in policy.

Args: adom: ADOM name package: Policy package name policyid: Local-in policy ID number

Returns: dict: Policy details with keys: - status: "success" or "error" - policy: Full local-in policy configuration - message: Error message if failed

Example: >>> result = await get_local_in_policy("root", "default", 1)

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and it does disclose the response shape (status/policy/message) and that failures surface a message. It says nothing about permissions, read-only semantics (only implied by 'Get'), or behavior when the policy ID does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by args, returns, and a short example, all compact. The Returns block is somewhat redundant given an output schema exists, and the example mainly reconfirms positional argument order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter getter with an output schema, the description covers purpose and response shape adequately. It leaves notable gaps on how to obtain the policy ID and what ADOM/package naming constraints apply, which matter given zero schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only restates the parameter names ('adom: ADOM name', 'package: Policy package name', 'policyid: Local-in policy ID number'). It adds no format hints, valid value sources, or how to discover a policyid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about a specific IPv4 local-in policy'), and the IPv4 qualifier implicitly distinguishes it from get_local_in_policy6 and list_local_in_policies. It stops short of naming those siblings explicitly, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no prerequisites (e.g., ADOM locked or not), and no comparison to alternatives like list_local_in_policies or get_local_in_policy6. Only the tool name implies its role as a single-record fetch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_local_in_policy6B

Get detailed information about a specific IPv6 local-in policy.

Args: adom: ADOM name package: Policy package name policyid: Local-in policy6 ID number

Returns: dict: Policy details with keys: - status: "success" or "error" - policy: Full local-in policy6 configuration - message: Error message if failed

Example: >>> result = await get_local_in_policy6("root", "default", 1)

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses that the tool returns a dict with status, policy, and message fields, including error handling, but does not mention permissions, side effects, or read-only behavior explicitly beyond the implied "get" semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by Args, Returns, and Example sections. The example earns its place by showing exact invocation syntax, though the Returns section partially duplicates the existing output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool, the description covers all required arguments, the return structure, and an invocation example. Given the output schema exists and annotations are absent, this is nearly complete, with the main gap being the lack of usage guidance relative to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It defines all three required parameters: adom as ADOM name, package as policy package name, and policyid as the local-in policy6 ID number, which adds meaning beyond bare schema titles but remains terse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: "Get detailed information about a specific IPv6 local-in policy." It distinguishes itself from list_local_in_policies6 and the IPv4 get_local_in_policy by explicitly naming the IPv6 local-in policy, though it does not name those siblings directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides only argument definitions and a call example. It gives no guidance on when to use this tool versus get_local_in_policy, list_local_in_policies6, or other policy-related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_packageA

Get detailed information about a policy package.

Args: name: Package name adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") include_details: Include policies and settings (default: False)

Returns: dict: Package details with keys: - status: "success" or "error" - package: Package object - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
nameYes
include_detailsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes the return format (dict with status, package, message) and implies a read-only operation ('Get'), but does not explicitly state safety traits, auth needs, or potential side effects. The description adds some context but lacks thorough behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with a purpose line, Args section, and Returns section. Every sentence adds value, with no redundancy. It is front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (3 parameters, 1 required, no enums, no nested objects) and the presence of a described output schema, the description covers all necessary aspects: parameters, defaults, return structure. It is complete for a retrieval tool and matches the context signals.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description fully compensates by explaining each parameter: name (package name), adom (ADOM name with default from env var or 'root'), and include_details (include policies and settings, default False). This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get detailed information about a policy package.' It uses a specific verb ('Get') and resource ('policy package'), distinguishing it from sibling tools like list_packages (which lists all packages) and delete_package/update_package (which modify).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving details of a single package, but does not explicitly compare with alternatives like list_packages or mention when not to use it. No exclusions or prerequisites are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_packet_capture_statusA

Get the running/packet-count status of packet captures.

FortiManager reports capture progress for all definitions in one call; when capture_id is given this filters the response down to that one definition.

Args: capture_id: ID of a specific capture definition to filter to (optional; returns all captures' status if unset)

Returns: dict: Status result with keys: - status: "success" or "error" - count: Number of capture statuses returned - captures: List of {id, max_packets, packets, running} objects - message: Error message if failed

Example: >>> result = await get_packet_capture_status(capture_id=2) >>> print(result["captures"][0]["running"]) # 1 if still running

NameRequiredDescriptionDefault
capture_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does well: it discloses that this is a status read, explains the all-versus-filtered response behavior, and documents the return structure. It does not discuss permissions, rate limits, or error conditions beyond noting the message field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose and filtering behavior, then structured into Args, Returns, and Example. Each section adds practical value, and the example clarifies how to read the running flag.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only status tool, the description is complete: purpose, filtering behavior, parameter meaning, return keys, and an invocation example are all present. The output schema also exists, so the return details are supplementary rather than required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter has 0% schema description coverage, but the description fully compensates by explaining that capture_id is optional, identifies a specific capture definition, and filters the response; unset returns all captures' status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: getting running/packet-count status for packet captures. It clearly distinguishes this from definition-listing and capture-control siblings by describing the returned status fields such as running, packets, and max_packets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains that FortiManager reports progress for all capture definitions in one call and that capture_id filters down to a single definition. This gives clear context for optional filtering, though it does not explicitly name alternatives such as list_packet_captures or explain when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_policy_servicesA

Get services configured on a firewall policy with optional group resolution.

Retrieves the service list from a firewall policy and optionally resolves each service/group into its detailed definition (ports, protocols, group members).

Useful for policy hardening workflows where you need to compare actual traffic against configured services.

Args: adom: ADOM name package: Policy package name policy_id: Policy ID number resolve: If True, resolve each service to its definition including port ranges and group members (default: True)

Returns: dict: Service information with keys: - status: "success" or "error" - policy_id: The policy ID queried - policy_name: Name of the policy - service_names: List of raw service names from the policy - services: Resolved service details (if resolve=True) - message: Error message if failed

Example: >>> # Get resolved services for policy 10 >>> result = await get_policy_services("root", "default", 10)

>>> # Get just the service names without resolution
>>> result = await get_policy_services("root", "default", 10, resolve=False)
NameRequiredDescriptionDefault
adomYes
packageYes
resolveNo
policy_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations present; description explains the resolve parameter's effect, return format (dict keys), and provides example usage. It does not discuss authorization or rate limits, but for a read operation, this level of detail is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with summary, detailed description, Args, Returns, and Example sections. Slightly verbose but each part serves a purpose; could be tightened but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is an output schema (implied by context), the description still adds return value details. Covers all aspects: what tool does, how parameters affect behavior, and expected output. No gaps for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description carries full burden. It fully explains all four parameters (adom, package, policy_id, resolve) with types, defaults, and behavior, adding significant value beyond the schema's property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves services configured on a firewall policy, with optional resolution. This distinguishes it from sibling tools like get_firewall_policy, get_service, or list_services.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description mentions policy hardening workflows as a use case but does not explicitly state when not to use it or provide alternatives. Implicit usage is clear but lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_preview_resultA

Get the result of an installation preview.

Call this after preview_install() task completes to see the detailed configuration changes.

Args: adom: ADOM name devices: Target devices [{"name": "FGT1", "vdom": "root"}, ...]

Returns: dict: Preview results with keys: - status: "success" or "error" - preview: Preview data with configuration changes - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses that the tool returns detailed configuration changes with status, preview data, and error message, implying a read-only operation. No side effects are mentioned but appropriate for a retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is structured with an intro, Args, and Returns sections. It is concise but includes a detailed Returns description. Could be slightly more front-loaded but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema is provided (Returns section), the description fully explains the return structure and the tool's role as a follow-up to preview_install. It is complete for the task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains adom as 'ADOM name' and devices with an example format, adding meaning beyond the schema's minimal type definitions. However, it does not fully describe the expected keys in the device objects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get the result of an installation preview' and specifies it is to be called after `preview_install()`, distinguishing it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call after preview_install() task completes and explains the purpose, but does not mention when not to use or provide alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scriptA

Get details of a specific CLI script.

Args: adom: ADOM name name: Script name

Returns: Script details including content

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the burden. It states that the tool returns script details including content, which is useful. However, it does not mention any permissions, rate limits, or side effects. Since it is a read operation, the description is minimally adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with three short sections (purpose, args, returns). Every sentence serves a function, and the purpose is front-loaded. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (not shown but confirmed), the description need not detail return values but still mentions 'details including content'. For a simple getter with two required parameters, the description is reasonably complete. It lacks details on permissions or error conditions, but that is acceptable for a read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (adom, name) with no descriptions. The description adds 'ADOM name' and 'Script name', which only restates the property names without adding significant semantic detail. With schema coverage at 0%, the baseline is 3, and the description barely compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get details of a specific CLI script.' This uses a specific verb (get) and resource (CLI script), distinguishing it from sibling tools like create_script, delete_script, and get_script_log_latest which deal with different aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that list_scripts should be used to enumerate scripts, or that get_script_log_* tools are for logs. No when-not-to-use or exclusion criteria are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_script_log_latestB

Get the latest script execution log.

Args: adom: ADOM name device: Optional device name to filter logs

Returns: Latest script execution log with content and execution time

NameRequiredDescriptionDefault
adomYes
deviceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It states the tool returns a log with content and execution time, implying a read-only operation, but it does not explicitly confirm non-destructive behavior or any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear structure: purpose statement, then Args and Returns sections. No extraneous information, though the Args section could be integrated more smoothly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, 1 required, no nested objects, output schema present), the description covers the essential inputs and output. However, it lacks usage context and behavioral notes, which are important for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description adds minimal meaning: 'adom: ADOM name' and 'device: Optional device name to filter logs'. This provides basic understanding but lacks format, constraints, or examples, leaving room for ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Get the latest script execution log', using a specific verb and resource. It distinguishes from sibling tools like get_script_log_output and get_script_log_summary by focusing on the 'latest' log.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives. It fails to mention prerequisites, limitations, or context for use, leaving the agent to infer from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_script_log_outputA

Get specific script execution output by log ID.

Log ID can be derived from task ID:

  • Scripts on Device DB or Package: log_id = str(task_id) + "1"

  • Scripts on remote device: log_id = str(task_id) + "0"

Args: adom: ADOM name log_id: Log ID from execution task or log summary device: Optional device name (required for device-specific logs)

Returns: Script execution output content

NameRequiredDescriptionDefault
adomYes
deviceNo
log_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It describes the operation as retrieving output, which is non-destructive. It does not mention authentication, rate limits, or error conditions, but the behavior is straightforward and adequately disclosed for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, starting with a clear purpose followed by an Args/Returns section. Every sentence adds value, and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (per context signals), the description does not need to detail return values. It covers parameter semantics thoroughly and includes helpful derivation logic for log_id. It could mention potential errors or prerequisites, but is otherwise complete for a simple retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates fully. It explains the purpose of each parameter: adom (ADOM name), log_id (derivation from task_id), and device (optional but required for device-specific logs). This adds significant meaning beyond the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get specific script execution output by log ID', which is a clear verb+resource+method. It implies differentiation from sibling tools like get_script_log_latest and get_script_log_summary through the focus on a specific log ID, but does not explicitly distinguish them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use the tool (to get output by log ID) and includes derivation of log_id from task_id. However, it does not explicitly state when not to use it or mention alternatives like get_script_log_latest or get_script_log_summary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_script_log_summaryA

Get script execution log summary.

Lists all script executions with log IDs for detailed retrieval.

Args: adom: ADOM name device: Optional device name to filter logs

Returns: List of script execution summaries with log_id, script_name, exec_time

NameRequiredDescriptionDefault
adomYes
deviceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must disclose behavior. It mentions listing all script executions and optional device filtering, but does not elaborate on scope (e.g., time range, pagination, permissions), leaving some ambiguity about 'all'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the main purpose, and structured with Args and Returns sections. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and the presence of an output schema (not shown), the description covers the essential return fields. However, it lacks details on pagination or error handling, which could improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by naming the parameters 'adom' and 'device' and briefly explaining them. The explanation is sufficient for usage but minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'script execution log summary'. It further explains it lists all script executions with log IDs for detailed retrieval, distinguishing it from similar tools like get_script_log_latest or get_script_log_output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context that the log IDs are for detailed retrieval, implying a workflow with another tool (get_script_log_output), but it does not explicitly name alternatives or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sdwan_templateA

Get details of a specific SD-WAN template.

Args: adom: ADOM name name: SD-WAN template name

Returns: SD-WAN template details including interfaces, SLAs, and rules

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It only states 'Get details' but does not specify if it is read-only, authentication requirements, error behavior, or any side effects. This is insufficient for a tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three lines, front-loaded with the main purpose, and includes a clear Args/Returns structure. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (2 required simple string params) and presence of output schema, the description covers purpose and parameters adequately. However, it lacks usage guidelines and behavioral transparency, leaving some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the description adds 'ADOM name' and 'SD-WAN template name' for the two parameters. This provides basic meaning beyond the schema titles but lacks format, constraints, or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get details of a specific SD-WAN template,' providing a specific verb and resource. It distinguishes from siblings like 'list_sdwan_templates' which lists all templates, and other get_* tools for different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and description (use when you need details of a specific template), but there is no explicit guidance on when to use this tool vs alternatives like 'list_sdwan_templates' or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_serviceC

Get detailed information about a service object.

Args: adom: ADOM name name: Service object name

Returns: dict: Service details with keys: - status: "success" or "error" - service: Full service configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description implies a read operation but does not explicitly state that it is read-only, nor does it disclose any side effects, authentication requirements, or rate limits. Since no annotations are provided, the description should carry the full burden, but it adds little beyond the verb.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with clear Args and Returns sections. It front-loads the main purpose and avoids unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get operation with an output schema described, the description covers the return structure and error status. However, it lacks details on when errors occur or how to interpret the 'message' field. The absence of usage context and parameter details reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description merely restates the parameter names and types ('adom: ADOM name', 'name: Service object name') without adding any additional context such as allowed values, formats, or examples. With 0% schema coverage, the description should compensate but fails to do so meaningfully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed information about a service object, using the verb 'get' and specifying the resource 'service object'. While not explicitly differentiating from siblings like 'get_address', the resource name is distinct enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as 'list_services' or 'get_service_group'. There are no explicit conditions, prerequisites, or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_service_groupA

Get detailed information about a service group.

Args: adom: ADOM name name: Service group name

Returns: dict: Group details with keys: - status: "success" or "error" - group: Full group configuration including members - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It clearly states the tool is a read operation ('Get detailed information') and outlines the return structure including status and error handling. It does not contradict any annotations, and the behavior is transparent for a get tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-line purpose, followed by clearly labeled Args and Returns sections. Every sentence adds value, and there is no unnecessary text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 required params, no enums, and an output schema), the description is complete. It explains the return format in detail, specifying keys like status, group, and message. No critical information is missing for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description's Args section adds meaningful context: 'adom: ADOM name' and 'name: Service group name'. This goes beyond the bare property names and clarifies the expected values, providing high value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get detailed information about a service group.' It uses a specific verb ('Get') and a well-defined resource ('service group'). Among sibling tools, there are other get_* tools and list_service_groups, but this one is distinct in that it retrieves details for a single group by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like list_service_groups or get_service. It lacks explicit context for usage, such as prerequisites or mention of alternative tools for listing or retrieving other objects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ssl_ssh_profileA

Get detailed information about an SSL/SSH inspection profile.

Args: adom: ADOM name name: SSL/SSH profile name

Returns: dict: Profile details with keys: - status: "success" or "error" - profile: Full profile configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It does disclose error behavior via the 'status' and 'message' keys, which is useful, but it says nothing about permissions needed, whether it only reads from a locked/unlocked ADOM, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose sentence, then compact Args and Returns blocks with no filler. Well-structured for a small tool, though the Args block largely duplicates the schema titles.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with both params documented and an output schema present, the description covers what's needed to invoke it correctly. The remaining gap is operational context (permissions, ADOM lock state), which is minor but non-zero.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate; it does document both parameters ('adom: ADOM name', 'name: SSL/SSH profile name'). However, these restate the field titles without adding format, case-sensitivity, or lookup-order guidance, so compensation is minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get detailed information about an SSL/SSH inspection profile'), so the agent knows exactly what it returns. It does not explicitly distinguish itself from siblings like list_ssl_ssh_profiles or get_* on other profile types, but the singular-noun naming makes the difference inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the required 'name' argument suggests this fetches one existing profile by identifier, probably after list_ssl_ssh_profiles. There is no explicit when-to-use / when-not-to-use statement and no mention of prerequisites such as the profile needing to exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_statusA

Get FortiManager system status and version information.

Returns comprehensive system status including:

  • FortiManager version and build

  • System hostname

  • Serial number

  • Admin domain mode

  • Platform information

  • HA status

Returns: dict: System status with keys: - status: "success" or "error" - data: System status information - message: Error message if failed

Example: >>> result = await get_system_status() >>> print(f"Version: {result['data']['Version']}") >>> print(f"Hostname: {result['data']['Hostname']}")

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the return structure, example usage, and implied read-only nature. However, it does not mention any side effects, authentication needs, or error handling details beyond a simple error message in the dict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the main purpose, followed by bullet points listing returned information, then a clear return schema and an example. Every element serves a purpose without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, output schema provided), the description is fully complete. It explains what is returned, the structure, and includes a usage example, leaving no ambiguity for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema coverage is trivially 100%. The description does not need to add parameter meaning, but it provides detailed return value semantics and an example, which adds value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves FortiManager system status and version information, listing specific fields like version, hostname, serial number, etc. It distinguishes itself from siblings like get_ha_status or get_device_status by focusing on the overall system.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but does not explicitly state when to use it versus alternatives or mention prerequisites. It lacks guidance on when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_templateB

Get details of a specific system template.

Args: adom: ADOM name name: System template name

Returns: System template details including widgets and assigned devices

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It implies a read operation ('Get details') and states return content, but fails to mention permissions, side effects, rate limits, or availability constraints. The description lacks sufficient transparency for a tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and uses a structured docstring format with Args and Returns sections. It avoids unnecessary words, but the Args section could be more concise by integrating into the main sentence. Still, it is well-organized and straightforward.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the basic purpose, parameters, and return value. Given the tool's simplicity (2 params, no nested objects), it is mostly complete. However, it omits potential error conditions, authentication requirements, or relationship to other templates (e.g., system vs CLI templates). With no annotations and no output schema details, a bit more context would be beneficial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, leaving the description responsible for explaining parameters. It only restates the parameter names ('adom: ADOM name', 'name: System template name') without providing format, valid values, examples, or contextual meaning. This adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get details' and identifies the resource 'system template'. It clearly distinguishes from sibling tools like list_system_templates (which lists all) and assign/unassign system templates (which modify). The description includes the return value scope, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the required parameters (adom and name), which indirectly tells when to use the tool. However, it does not explicitly provide guidance on when to use this tool versus alternatives like get_template or list_system_templates. No exclusions or context about prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_taskA

Get detailed status of a specific task.

Args: task_id: Task ID number include_details: Include task line details (default: False)

Returns: dict: Task details with keys: - status: "success" or "error" - task: Task object with id, state, progress, result, etc. - lines: Task line details (if include_details=True) - message: Error message if failed

Example: >>> result = await get_task(12345) >>> print(f"State: {result['task']['state']}") >>> print(f"Progress: {result['task'].get('percent', 0)}%")

NameRequiredDescriptionDefault
task_idYes
include_detailsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided. The description makes it clear this is a read operation ('Get detailed status'), and details the return structure including success/error states. While not exhaustive, it sufficiently conveys the non-destructive behavior and expected output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with clear sections: one-liner, Args, Returns, Example. It is front-loaded with the core purpose and uses minimal, efficient language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, and the description covers input, output (with keys), and an example. For a simple retrieval tool, this is comprehensive. The only gap is explicit usage guidelines, but overall it is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description's Args section explains both parameters: task_id (as 'Task ID number') and include_details (as 'Include task line details (default: False)'). This adds meaningful context beyond the input schema, which only provides types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed status of a specific task. This distinguishes it from sibling tools like list_tasks (which lists all tasks) and wait_for_task (which waits for completion), as it focuses on a single task's details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly suggests use for individual task status via its name and return structure, but lacks explicit guidance on when to use this versus alternatives like list_tasks or wait_for_task. No when-not-to-use context is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_templateB

Get details of a specific provisioning template.

Args: adom: ADOM name name: Template name

Returns: Template details including settings and scope

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavior. It only states the return includes 'settings and scope,' but does not explicitly confirm idempotency, side effects, or whether authentication is required. The 'get' nature implies read-only, but this is not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with a single-line purpose followed by labeled Args and Returns sections. Every word adds value, and there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description need not detail return values extensively. However, it omits context such as the required ADOM scope and the uniqueness of template names. For a simple retrieval tool, the description is adequate but leaves some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet the description adds no meaning beyond parameter names ('adom' and 'name'). It does not specify formats, valid values, or relationships, forcing the agent to rely solely on parameter names which are moderately self-explanatory but lack depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get details of a specific provisioning template,' which is a specific verb+resource combination. Among sibling tools with get_* prefixes, this one uniquely targets provisioning templates, making its purpose distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like list_templates or other get_* tools. It does not mention conditions, exclusions, or contextual prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_template_groupB

Get details of a template group.

Args: adom: ADOM name name: Template group name

Returns: Template group details including member templates

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description only states it returns 'template group details including member templates', but lacks info on read-only nature, idempotency, or access requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is short and front-loaded with purpose. Includes arg/return sections efficiently. No wasted words, but could be slightly more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has an output schema, so return values are covered. However, missing context such as when to use versus list_template_groups or how parameters affect results. Adequate but with gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet description only lists parameter names (adom, name) without adding meaning, format, or constraints beyond what schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Get details of a template group' with a specific verb and resource. It distinguishes from sibling tools like list_template_groups (list all) and get_template (single template).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives like list_template_groups or get_template. No prerequisites or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_waf_profileB

Get detailed information about a WAF profile.

Args: adom: ADOM name name: WAF profile name

Returns: dict: Profile details with keys: - status: "success" or "error" - profile: Full profile configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It implies a read-only operation and documents the response keys including status and error message, but it does not state permissions, failure conditions, or whether the profile must already exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded, with structured Args and Returns sections. The Returns section is somewhat redundant because an output schema exists, but otherwise there is little wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with two required parameters and an output schema, the description covers purpose, arguments, and response shape adequately. It lacks usage guidance relative to sibling tools and permission details, but those gaps are moderate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It labels both required parameters and clarifies that 'name' refers to the WAF profile name, but it does not provide format examples, constraints, or additional semantic detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific verb 'Get' and resource 'WAF profile', and the phrase 'detailed information' distinguishes it from a list operation. However, it does not explicitly name or distinguish the sibling tools such as list_waf_profiles or create/update/delete_waf_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives like list_waf_profiles or other profile-related tools. The usage is only implied by the presence of 'adom' and 'name' parameters, which suggest retrieving a single named profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_webfilter_profileB

Get detailed information about a web filter profile.

Args: adom: ADOM name name: Web filter profile name

Returns: dict: Profile details with keys: - status: "success" or "error" - profile: Full web filter profile configuration - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It does disclose the return shape including a status/message error path, which is useful, but it says nothing about required permissions, ADOM scoping behavior, or whether an unknown name errors versus returns empty — meaningful gaps for a read 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded, then Args and Returns are cleanly sectioned with no filler. Every line earns its place, and it is easy to scan quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool this is mostly adequate, and an output schema exists so return values needn't be exhaustively detailed. However, with no annotations the description should say more about permissions, scoping, and not-found/error behavior to be truly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It documents both parameters ('adom: ADOM name', 'name: Web filter profile name'), but this only slightly expands on the schema titles and gives no format, example, or identifier conventions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get detailed information') and resource ('web filter profile'), which clearly implies a single-object fetch. It does not explicitly name the sibling list_webfilter_profiles or contrast itself with create/update/delete_webfilter_profile, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'get detailed' phrasing implies when to use it (fetch one profile by name vs the sibling list_webfilter_profiles for enumeration), but there is no explicit statement of when to use this versus alternatives, nor any prerequisite guidance. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

health_checkA

Check FortiManager MCP server health and connection status.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears full burden. It only states 'Check health and connection status' without disclosing what endpoints are tested, how health is determined, or any behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words. However, it could benefit from slightly more detail without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has zero parameters and an output schema exists (not shown), the description is adequate but lacks context about what 'healthy' means or any side effects. It is minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the schema is trivially covered. The description adds no parameter-specific meaning, but for zero-parameter tools the baseline is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Check') and the resource ('FortiManager MCP server health and connection status'). It distinguishes this tool from sibling tools that perform CRUD or management operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage as a preliminary health check but provides no explicit when-to-use or when-not-to-use guidance, nor does it mention alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

install_device_settingsA

Install device settings only (without policy package).

Deploys device-level configurations like interfaces, DNS, NTP without reinstalling the full policy package.

Args: adom: ADOM name devices: Target devices [{"name": "FGT1", "vdom": "root"}, ...]

Returns: dict: Installation result with keys: - status: "success" or "error" - task_id: Task ID for monitoring - message: Status or error message

NameRequiredDescriptionDefault
adomYes
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description fails to disclose side effects, required permissions, or potential impacts like overwriting existing settings or service restarts. Return dict partially covers outcome but not behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with main purpose, includes parameter list and return structure. Not overly verbose but could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Provides basic understanding of purpose, parameters, and return values. Lacks preconditions, side effects, or installation behavior details, which would be expected for a device modification tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds meaning to both parameters: adom as ADOM name and devices as list of objects with name and vdom. Clarifies structure beyond bare schema, though schema has 0% description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool installs device settings (interfaces, DNS, NTP) rather than a full policy package, distinguishing it from sibling tools like install_package.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions it installs 'only' device settings 'without policy package', providing clear context for when to use. Lacks explicit 'when not to' or alternatives, but context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

install_packageA

Install a policy package to managed devices.

Deploys firewall policies and configurations from a policy package to the specified devices. This is an asynchronous operation - use wait_for_task() to monitor completion.

By default (FMG_INSTALL_SAFETY=strict) a real install requires a verified preview first: run preview_install for the same ADOM, package, and devices, wait for its task to finish, then install. Each preview authorizes one install, and only while the package is unchanged — if the package was edited after the preview, the install is refused (preview_stale) and a fresh preview is required.

Args: adom: ADOM name package: Policy package name devices: Target devices [{"name": "FGT1", "vdom": "root"}, ...] preview: If True, only preview changes without applying (default: False)

Returns: dict: Installation result with keys: - status: "success" or "error" - task_id: Task ID for monitoring (if successful) - message: Status or error message

Example: >>> # Install to single device >>> result = await install_package( ... adom="root", ... package="default", ... devices=[{"name": "FGT-HQ", "vdom": "root"}] ... ) >>> if result["status"] == "success": ... await wait_for_task(result["task_id"])

>>> # Preview installation first
>>> result = await install_package(
...     adom="root",
...     package="default",
...     devices=[{"name": "FGT-HQ", "vdom": "root"}],
...     preview=True
... )
NameRequiredDescriptionDefault
adomYes
devicesYes
packageYes
previewNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full responsibility for behavioral disclosure. It clearly states that the operation is asynchronous, requires a preview before actual install, and that preview authorizes a single install only when the package is unchanged. It also explains the preview parameter behavior and what the return value contains (status, task_id, message).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary line, a behavioral paragraph, parameter list, return values, and examples. It is slightly verbose but every part adds value. The examples are helpful. Could be slightly more concise, but still effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all necessary aspects: purpose, usage workflow, parameters, return values, and examples. With an output schema present, the description still provides sufficient context about return values. It is complete for an agent to correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining each parameter: adom, package, devices (with example format), and preview (default False, preview-only behavior). The device parameter format is shown in the example and args section, adding meaning beyond the schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Install a policy package to managed devices.' It specifies the action (install) and the resource (policy package), and distinguishes it from sibling tools like preview_install and assign_* tools by focusing on deployment of firewall policies from a package to devices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on when to use the tool, including the prerequisite of a verified preview via preview_install and the behavior of the preview parameter. It also explains the asynchronous nature and need to use wait_for_task. However, it does not explicitly mention alternatives or when not to use it, such as for assigning templates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_addressesA

List firewall address objects in an ADOM.

Address objects define network entities (hosts, subnets, FQDNs) used in firewall policies.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match) type_filter: Filter by type ("ipmask", "fqdn", "iprange", "wildcard")

Returns: dict: Address list with keys: - status: "success" or "error" - count: Number of addresses - addresses: List of address objects - message: Error message if failed

Example: >>> # List all addresses >>> result = await list_addresses("root")

>>> # Find FQDN addresses
>>> result = await list_addresses("root", type_filter="fqdn")
NameRequiredDescriptionDefault
adomNo
name_filterNo
type_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It specifies that the tool returns a dict with status, count, addresses, and message, but does not explicitly state it is a read-only operation or disclose any side effects, rate limits, or authentication requirements. The term 'list' implies safety, but explicit disclosure is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args and Returns sections, concise yet comprehensive. Every sentence adds value, and it includes practical examples. It is appropriately front-loaded with the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (3 parameters, output schema exists), the description is complete. It explains the return dictionary structure, parameter semantics, and provides usage examples. No obvious gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining each parameter: adom (ADOM name with default from env var), name_filter (partial match filtering), and type_filter (allowed values: ipmask, fqdn, iprange, wildcard). It also includes default behavior and usage examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List firewall address objects in an ADOM' and defines address objects as network entities (hosts, subnets, FQDNs). This distinguishes it from sibling tools like get_address (singular), create_address_*, delete_address, and list_address_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context with parameter explanations and examples (e.g., using type_filter='fqdn' to find FQDN addresses). However, it does not explicitly state when not to use this tool or suggest alternatives like search_objects or get_address.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_address_groupsA

List firewall address groups in an ADOM.

Address groups contain multiple address objects for easier policy management.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Group list with keys: - status: "success" or "error" - count: Number of groups - groups: List of address group objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It details the return format but lacks information on pagination, rate limits, or any side effects. It is adequate for a simple list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with clear args and returns sections. It front-loads the purpose. The sentence about address groups is background but not essential; overall it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description covers parameters and output adequately for a simple list, it omits details about environment variable fallback behavior, authentication, and whether the list is paginated. It is acceptable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaning by explaining 'adom' uses an env var default and 'name_filter' performs partial matching. This compensates well for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List firewall address groups in an ADOM', which is a specific verb and resource. It distinguishes from siblings like 'get_address_group' (single) and 'list_addresses' (address objects).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing multiple address groups but does not explicitly state when to use this tool versus alternatives like 'get_address_group' or mention any prerequisites or when-not-to-use scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adom_revisionsB

List the ADOM DB revision history for an ADOM.

Args: adom: ADOM name fields: Specific fields to return (optional, returns all if omitted)

Returns: dict: status, adom, count, revisions (each entry has version, name, desc, created_by, created_time, locked)

Example: >>> result = await list_adom_revisions("demo") >>> for rev in result["revisions"]: ... print(rev["version"], rev["desc"])

NameRequiredDescriptionDefault
adomYes
fieldsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden, and it does disclose the response shape (status, adom, count, revisions with version/name/desc/created_by/created_time/locked), which is genuine added context. However, it says nothing about ordering, pagination/size limits, or permissions, so the behavioral profile 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and effective, but the Args/Returns/Example docstring block partly restates the input schema and duplicates a return structure that the output schema already defines. It is not bloated, but several lines do not earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only list tool with an output schema, the definition gives enough to call it correctly: purpose, both parameters, and the revision entry fields. The missing piece is guidance on choosing it over the adjacent revision tools (get/diff/revert).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: 'adom: ADOM name' and 'fields: Specific fields to return (optional, returns all if omitted)' clarify the meaning and the default behavior of the optional parameter. The only gap is that it does not enumerate the valid field names accepted by 'fields'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line states a specific verb and resource: 'List the ADOM DB revision history for an ADOM,' which is unambiguous. It does not differentiate from close siblings such as get_adom_revision, diff_adom_revision, or list_device_revisions, so an agent must infer which of these to reach for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to use this versus get_adom_revision, diff_adom_revision, revert_adom_revision, or list_policy_revisions. There is also no mention of preconditions, such as whether the ADOM must be locked or whether it must exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adomsA

List all Administrative Domains (ADOMs) in FortiManager.

ADOMs partition FortiManager into separate management domains, each with its own devices, policies, and configurations.

Args: fields: Specific fields to return (optional, returns all if not specified)

Returns: dict: ADOM list with keys: - status: "success" or "error" - count: Number of ADOMs - adoms: List of ADOM objects with name, desc, state, etc. - message: Error message if failed

Example: >>> result = await list_adoms() >>> for adom in result["adoms"]: ... print(f"{adom['name']}: {adom.get('desc', 'No description')}")

NameRequiredDescriptionDefault
fieldsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description only mentions the return structure but fails to disclose behavioral traits such as authentication requirements, rate limits, or whether it is a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections for args, returns, and an example. It is appropriately sized for the tool's simplicity, though could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity and the presence of an output schema (described), the description covers the return values adequately. It lacks pagination or limit details but is generally complete for a list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the 'fields' parameter meaningfully: 'Specific fields to return (optional, returns all if not specified)'. This adds value beyond the schema, which has 0% description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all Administrative Domains (ADOMs) in FortiManager, using a specific verb and resource. It distinguishes from sibling 'get_adom' implicitly by being a list operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives like get_adom. It does not mention when not to use it or any prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_antivirus_profilesA

List antivirus profiles in an ADOM.

Antivirus profiles define virus/malware scanning behavior per protocol (HTTP, FTP, SMTP, etc.) and are applied to firewall policies.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Profile list with keys: - status: "success" or "error" - count: Number of profiles - profiles: List of antivirus profile objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden; 'List' implies a read-only, non-destructive operation, and it usefully discloses the ADOM default resolution order and the error shape ('message'). It does not mention pagination, result limits, or required permissions, which are the main remaining unknowns for a listing call with no 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then a short domain note, then Args and Returns. The domain note and the Returns block are somewhat verbose for a simple list tool, but nothing is actively wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the Returns section is partly redundant, but the description is otherwise complete for a low-complexity, two-optional-parameter read tool. Adding pagination or ordering behavior would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description fully compensates: adom is explained with its fallback chain (DEFAULT_ADOM env var, then "root") which is not in the schema at all, and name_filter is documented as a partial-match filter rather than exact. Both of the two parameters gain meaning beyond the bare anyOf string types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List antivirus profiles in an ADOM') and adds a one-line explanation of what the objects are and where they apply (firewall policies). This clearly separates it from get_antivirus_profile and the create/update/delete siblings, though it does not name them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implicit guidance only: 'List' plus a name_filter arg implies browse/search use, but there is no statement of when to use this instead of get_antivirus_profile for a single profile, nor any prerequisite or exclusion. Adequate but leaves 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.

list_application_listsA

List application-control lists in an ADOM.

Application control lists define pass/block/monitor actions for application signatures and categories, applied to firewall policies.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: List result with keys: - status: "success" or "error" - count: Number of application-control lists - lists: List of application-control list objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the disclosure burden: it implies read-only behavior via "List" and documents the return envelope including an error message key. However it omits permissions required, pagination/result limits for large collections, and any ADOM-lock or scope caveats, which matters for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and domain explanation, then args, then returns; each sentence serves a role. The Returns block restates what the existing output schema already declares, which is mild redundancy but not harmful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return-value section is largely duplicative, and since there are no annotations the description should have covered read-only intent and pagination behavior for a list endpoint. It is adequate for a simple two-parameter list tool but leaves scope and volume questions unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and mostly does: it explains that adom defaults to the DEFAULT_ADOM env var or "root", and that name_filter is a partial-match filter. That is meaningful semantics beyond the bare typed properties, though the matching syntax/case sensitivity of name_filter is left unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List application-control lists in an ADOM") and follows with a sentence explaining what an application-control list is and where it applies. The listing scope is clear relative to the singular get_application_list sibling, though it never explicitly names that sibling as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the agent can infer this is the way to enumerate application-control lists before calling create/update/delete_application_list, and the mention of firewall policies hints at the domain. There is no explicit when-to-use, when-not-to-use, or named alternative such as get_application_list for fetching a single list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_available_firmwareA

List firmware versions available for a platform.

Combines versions on FortiGuard (FDS) servers with any versions imported by a FortiManager administrator -- this is the device-reported catalog of what CAN be installed, not just what's already downloaded (see list_firmware_images for that).

Args: platform: Platform string, e.g. "FortiGate-VM64-KVM" (omit to get firmware for all platforms) product: Product code, e.g. "FGT", "FMG" (optional)

Returns: dict: Firmware catalog with keys: - status: "success" or "error" - version_list: List of {platform, product, versions: [...]} - message: Error message if failed

Example: >>> result = await list_available_firmware(platform="FortiGate-VM64-KVM") >>> for entry in result["version_list"]: ... print(entry["platform"], len(entry["versions"]))

NameRequiredDescriptionDefault
productNo
platformNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full load: it discloses that results combine remote FortiGuard server data with locally imported versions, frames the call as read-only ('list'), and documents the success/error status in the return. It stops short of noting auth requirements, remote-call latency, or result-size limits, which matter for a tool that reaches out to FDS.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-sentence purpose and the sibling distinction before the Args/Returns/Example blocks. The example block is somewhat redundant given the Returns section, but nothing is genuinely wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the description still outlines version_list entries, which removes any ambiguity about nested shape. For a two-optional-param read tool, nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — the JSON schema has only titles and null defaults — so the description must compensate, and it mostly does: it gives a concrete platform example string, states that omitting platform returns all platforms, and gives product codes with an example. Neither parameter's exact matching semantics (e.g. exact string match vs prefix) is spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (list available firmware versions) and immediately scopes it: the catalog of what CAN be installed, merged from FortiGuard FDS and admin-imported versions. It explicitly distinguishes itself from the sibling list_firmware_images, so an agent can pick between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear selection context by naming list_firmware_images as the alternative for already-downloaded images, and notes the omit-platform behavior for an all-platforms sweep. It does not address the other closely related siblings (get_firmware_upgrade_path, upgrade_device_firmware), so the routing is not fully exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_cli_template_groupsA

List CLI template groups in an ADOM.

CLI template groups contain CLI commands to be executed on devices.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") limit: Maximum number to return

Returns: List of CLI template groups

NameRequiredDescriptionDefault
adomNo
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, so description carries full burden. It implies a read-only listing operation, which is low-risk, but lacks details on any behavioral constraints like pagination limits or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description includes an extra sentence explaining what CLI template groups are, which is background context. While not extremely verbose, it could be streamlined. The Args/Returns structure is clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple nature of the tool and the presence of an output schema (not shown), the description covers the purpose, parameters, and return type adequately. No major gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, and the description compensates by explaining both parameters: adom (with default logic) and limit (maximum number). This adds meaningful context beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'List' and the resource 'CLI template groups' scoped to an ADOM. It is distinct from siblings like 'get_cli_template_group' (singular) and 'list_template_groups' (without CLI prefix), though not explicitly differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides basic understanding of the tool's function but offers no guidance on when to use this tool over alternatives or any prerequisites. No mention of when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_dhcp_serversA

List DHCP servers configured in a device's device DB.

Args: device: Managed device name vdom: VDOM to read (default "root")

Returns: dict with device, vdom, count and dhcp_servers (raw device-DB objects, keyed by numeric id)

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It does disclose the result shape (dict with device, vdom, count, and dhcp_servers keyed by numeric id), which usefully signals an unfiltered raw dump, but it says nothing about read-only safety guarantees, permissions, or pagination/size limits for large device DBs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and the Args/Returns blocks are compact and scannable. The structure is docstring-conventional rather than prose-tight; the Args lines duplicate names already in the schema, but they earn their place given 0% schema coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema, the description covers inputs, defaults, and the return shape adequately. The only real gap is behavioral: with no annotations, nothing confirms the operation is non-mutating or notes any access requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and has no enums, so the description must compensate, and it does: both parameters are explained — 'device: Managed device name' (clarifying it is the managed device identifier, not a serial or IP) and 'vdom: VDOM to read (default "root")', which restates the default meaningfully as a read scope.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: list DHCP servers configured in a device's device DB, with the scope (device DB, per-device/per-VDOM) made explicit. It is clearly distinguishable from the create/update/delete_device_dhcp_server siblings, though it does not name them or call out the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the name and the phrase 'configured in a device's device DB' — an agent can infer this is the read path before mutating DHCP servers. There is no explicit when-to-use guidance, no statement of prerequisites, and no naming of alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_groupsA

List all device groups in an ADOM.

Device groups organize managed devices for bulk operations like policy installation or configuration deployment.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root")

Returns: dict: Device groups with keys: - status: "success" or "error" - count: Number of groups - groups: List of device group objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description adequately discloses behavior: it lists all device groups, is read-only, and returns a defined structure. The return format is described in detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with a brief intro followed by args and returns. No wasted words, but could be slightly more compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and an output schema, the description is complete. It explains inputs, outputs, and provides enough context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter adom has no schema description, but the description adds crucial context: default behavior (from env var or 'root'). This compensates fully for the 0% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all device groups in an ADOM, with a specific verb and resource. It also explains the purpose of device groups, distinguishing it from list_devices and other list tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions the adom parameter but does not provide explicit guidance on when to use this tool versus alternatives. Usage is implied but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_ipsec_phase1_interfacesA

List IPsec phase1-interface (remote gateway) definitions in a device's device DB.

Args: device: Managed device name vdom: VDOM to read (default "root")

Returns: dict with device, vdom, count and interfaces (credential fields stripped -- see _PHASE1_SECRET_FIELDS)

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It usefully notes that credential fields are stripped from the output (see _PHASE1_SECRET_FIELDS), which is valuable context. However, it does not explicitly confirm that this is a read-only operation with no side effects, nor does it mention any permission or rate-limit considerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by structured Args and Returns sections. Every sentence adds value, and there is no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists and a list tool is relatively simple, the description covers the essential aspects: purpose, parameters, and a notable return behavior (credential stripping). The lack of explicit read-only or permission details is a minor gap, but overall the definition is complete enough for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It defines both parameters: 'device: Managed device name' and 'vdom: VDOM to read (default "root")', giving clear meaning for each. The explanation is concise but adequate for a simple two-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (IPsec phase1-interface definitions in a device's device DB), and it clearly distinguishes from siblings like get_device_ipsec_phase1_interface (get one) and list_device_ipsec_phase2_interfaces (phase2). An agent can identify the correct tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb 'List' and the resource, but the description offers no explicit when-to-use guidance or alternatives. It doesn't mention when to choose this over get_device_ipsec_phase1_interface or list_device_ipsec_phase2_interfaces, leaving the agent to infer from tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_ipsec_phase2_interfacesA

List IPsec phase2-interface (tunnel/selector) definitions in a device's device DB.

Args: device: Managed device name vdom: VDOM to read (default "root")

Returns: dict with device, vdom, count and interfaces

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It does disclose the read-only nature ('list', 'VDOM to read') and the shape of the response (a dict with device, vdom, count, interfaces), but says nothing about permissions, behavior when the device or VDOM does not exist, or result volume.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by compact Args/Returns sections; nothing is padded. The Returns block is partly redundant given an output schema exists, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only list tool with an output schema present, the description covers purpose, both arguments, the default VDOM, and the response shape — enough to call it correctly. Missing only edge-case behavior and error conditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning, and it does define both parameters ('device: Managed device name', 'vdom: VDOM to read, default "root"'). The explanations are minimal and add little beyond the schema titles/defaults — no format, scoping, or validity details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource ('List IPsec phase2-interface (tunnel/selector) definitions in a device's device DB'), which clearly separates it from the get/create/update/delete phase2 siblings. However, it never explicitly redirects to get_device_ipsec_phase2_interface for a single object, leaving that differentiation to the reader's inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the verb 'List' plus the required 'device' argument; there is no explicit statement of when to prefer this over get_device_ipsec_phase2_interface or the phase1 list tool. No prerequisites, no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_revisionsA

List the device DB revision history for a managed device.

Every install, auto-update, retrieve, or revert creates a new device DB revision. base_ver is the revision FortiManager currently considers in sync with the real device configuration.

Note: Requires the device to have at least one device DB revision on record (i.e. it has been installed to or retrieved from at least once). A freshly added device that has never gone through either will make FortiManager return a generic internal-server error here rather than an empty list -- that is FMG's own handling of an empty revision table, not a sign this tool or the underlying API is broken.

Args: device: Managed device name

Returns: dict: status, device, base_ver, count, revisions (each entry has revision, comments, instime/instusr, modtime/modusr, status, tag)

Example: >>> result = await list_device_revisions("hub2") >>> for rev in result["revisions"]: ... print(rev["revision"], rev["comments"])

NameRequiredDescriptionDefault
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses the important edge case that a device with no revisions yields an internal-server error, explains that this is FMG's handling rather than a broken tool, and clarifies base_ver's meaning. It omits a direct read-only statement and pagination/rate-limit details, but the critical behavior is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then structured into a note, args, returns, and example. Every section adds value, though the example is slightly redundant given the output schema. It is somewhat verbose but well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one required parameter, output schema present), the description covers everything an agent needs: purpose, the edge-case error behavior, meaning of base_ver, and a concrete usage example. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has low description coverage (0%) and only one parameter. The description compensates by saying 'device: Managed device name', which clarifies the expected value beyond the bare schema title 'Device'. For a single-parameter tool this is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List the device DB revision history') and immediately clarifies scope by explaining what creates a revision and what base_ver means. This distinguishes it from siblings like get_device_revision or revert_device_revision without needing to name them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Note' gives clear operational guidance: the device must have at least one revision, and a freshly added device will trigger a generic internal-server error rather than an empty list. It lacks an explicit comparison to alternatives such as get_device_revision, but the context is strong enough for an agent to know when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesA

List all managed devices in an ADOM.

FortiManager manages FortiGate and other Fortinet devices. This lists all devices registered in the specified ADOM.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") fields: Specific fields to return (optional)

Returns: dict: Device list with keys: - status: "success" or "error" - count: Number of devices - devices: List of device objects with name, ip, os_ver, etc. - message: Error message if failed

Example: >>> result = await list_devices("root") >>> for device in result["devices"]: ... print(f"{device['name']}: {device.get('ip', 'N/A')}")

NameRequiredDescriptionDefault
adomNo
fieldsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses the tool's read-only nature and return format including status, count, devices, and message. It provides an example but does not mention error conditions, permissions, or pagination. Overall, it effectively communicates behavior beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with separate Args and Returns sections and an example. It is slightly verbose with redundant context about FortiManager, but the core purpose is front-loaded. Efficient for a two-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (two optional params, no output schema provided), the description covers purpose, parameters, return format, and an example. It is complete enough for agent invocation but lacks error handling details and prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the description compensates by explaining the 'adom' default behavior and 'fields' purpose. However, it does not list available field names or validate input types beyond the schema. Adds meaningful context but could be more specific.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all managed devices in an ADOM, with a specific verb and resource. It distinguishes from sibling tools like list_adoms or list_device_groups by specifying 'devices' and 'managed devices' context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing devices but does not explicitly state when to use this tool over alternatives like search_devices or get_device. It lacks when-not-to-use guidance or comparisons with similar list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_vapsB

List wireless VAPs (SSIDs) in a device's device DB.

Args: device: Managed device name vdom: VDOM to read (default "root")

Returns: dict with device, vdom, count and vaps (passphrases stripped)

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It does add a genuinely useful disclosure — passphrases are stripped from the returned VAPs — and names the return shape, but it omits pagination/limits, permission or authentication requirements, and what happens when the device or VDOM is unknown.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in a single sentence, followed by a compact Args/Returns breakdown with no filler. The Args section slightly restates schema fields, but the added semantic detail justifies the space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is partly redundant, yet the description still usefully summarizes the dict keys and the passphrase stripping. For a simple two-parameter list tool this is nearly complete; only error behavior and any result-size limits are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: it clarifies that device is a "Managed device name" (not an ADOM or serial) and that vdom selects the VDOM to read with a default of "root". Only the exact accepted identifier format and valid VDOM names remain undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List wireless VAPs (SSIDs)") and scopes it to a single device's device DB, which distinguishes it from ADOM-level profile listings like list_device_wtp_profiles. It does not name sibling read/write counterparts such as create_device_vap or list_device_wtps, so the differentiation is implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Args block enumerates inputs but gives no when-to-use guidance, no prerequisites (e.g. device must be managed/adopted), and no exclusions relative to alternatives like list_device_wtps or get_device_wtp_profile. The agent must infer that this is the read-only path because the verb is "list".

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_vdomsA

List VDOMs for a specific device.

Virtual Domains (VDOMs) are independent virtual instances within a FortiGate device, each with its own configuration.

Args: device: Device name adom: ADOM name (default: from DEFAULT_ADOM env var, or "root")

Returns: dict: VDOM list with keys: - status: "success" or "error" - count: Number of VDOMs - vdoms: List of VDOM objects with name, status, etc. - message: Error message if failed

Example: >>> result = await list_device_vdoms("FGT-HQ", "root") >>> for vdom in result['vdoms']: ... print(f"VDOM: {vdom['name']}")

NameRequiredDescriptionDefault
adomNo
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes the return format and gives an example, but does not explicitly state that the operation is read-only or discuss any side effects. Given the lack of annotations, a score of 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with 'Args' and 'Returns' sections and an example. It is slightly verbose but each part adds value. Could be trimmed slightly but still efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the return format with status, count, vdoms, and message, and gives an example. Given the presence of an output schema (implied by the returns documentation), the description is fairly complete for this tool's purpose. Could mention possible error scenarios or rate limits, but not essential here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add meaning. It explains 'device' as 'Device name' and 'adom' as 'ADOM name (default: from DEFAULT_ADOM env var, or "root")', which goes beyond the schema's type-only information. This adds useful default and source context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List VDOMs') and the target resource ('for a specific device'). It defines VDOMs and distinguishes itself from sibling list_* tools by focusing on VDOMs. The example reinforces the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to list VDOMs for a device) and provides default behavior for the adom parameter. However, it doesn't explicitly state when not to use it or mention alternatives, though the context among sibling tools makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_wtp_profilesB

List FortiAP (WTP) profiles in a device's device DB.

Args: device: Managed device name vdom: VDOM to read (default "root")

Returns: dict with device, vdom, count and profiles (credential fields stripped -- see _WTP_PROFILE_SECRET_FIELDS)

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that credential fields are stripped from the returned profiles and sketches the return shape, but it omits permissions, error behavior, and pagination details for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded, and organized into args and returns sections. The reference to an internal constant (_WTP_PROFILE_SECRET_FIELDS) is slightly implementation-specific but does not seriously harm conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter list tool with an output schema, the description covers both arguments and the general return structure. It is nearly complete, with only minor omissions around permissions or error cases that are not essential for a listing operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: 'device' is explained as the managed device name, and 'vdom' is described as the VDOM to read with a default of 'root'. This adds meaningful context beyond the bare string-typed schema fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list FortiAP (WTP) profiles in a device's device DB. It is clearly distinguishable from list_device_wtps (lists WTPs) and get_device_wtp_profile (gets a single profile), though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as list_device_wtps or get_device_wtp_profile. It only states what the tool does and its arguments, leaving selection entirely to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_wtpsA

List managed FortiAPs registered in a device's device DB.

Args: device: Managed device name (the wireless controller / FortiGate) vdom: VDOM to read (default "root")

Returns: dict with device, vdom, count and wtps (device-DB objects keyed by wtp-id/serial, credential fields stripped -- see _WTP_SECRET_FIELDS)

NameRequiredDescriptionDefault
vdomNoroot
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose a real behavioral trait beyond the schema: credential fields are stripped from returned objects (references _WTP_SECRET_FIELDS). It implies read-only via 'List' and 'VDOM to read' but never states permissions or rate limits, so it stops short of full disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by compact Args/Returns sections; every line carries information. The internal reference _WTP_SECRET_FIELDS is slightly implementation-specific jargon an agent cannot act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool the description covers input meaning, default behavior, and the shape of the result, so an agent could call it correctly. The Returns block partly duplicates the existing output schema, but nothing essential is missing; only auth/permission context is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and largely does: device is explained as the wireless controller / FortiGate, and vdom is 'VDOM to read' with its default 'root'. It adds meaning beyond the bare 'Vdom' title, though it gives no example values or note on whether vdom affects scoping of results.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb+resource pair ('List managed FortiAPs registered in a device's device DB') that is unambiguous and distinct from the singular get_device_wtp sibling. It never explicitly names or contrasts with siblings, relying on the list/get convention to differentiate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the reader infers you call this to enumerate WTPs for one device. There is no explicit when-to-use, when-not-to-use, or pointer to get_device_wtp for a single AP or list_device_wtp_profiles for profiles.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_dlp_profilesA

List DLP (Data Loss Prevention) profiles in an ADOM.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Profile list with keys: - status: "success" or "error" - count: Number of profiles - profiles: List of DLP profile objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the return structure, error-message behavior, and the ADOM default source, but it does not describe permissions, pagination, or other operational constraints for the listing operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a single clear purpose sentence, followed by concise argument and return sections. It is appropriately sized, though the return-value listing duplicates information already available in the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with two optional parameters and an output schema, the description provides enough context about parameters and return shape. Missing explicit usage guidance and pagination details are minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does so for both parameters: adom is explained as defaulting from DEFAULT_ADOM or 'root', and name_filter is documented as a partial-match filter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List DLP (Data Loss Prevention) profiles in an ADOM.' This clearly distinguishes it from sibling tools like get_dlp_profile, create_dlp_profile, update_dlp_profile, and delete_dlp_profile by its listing scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb 'List' and the presence of an optional name filter, but the description does not explicitly say when to use this tool versus alternatives such as get_dlp_profile or list_dnsfilter_profiles. No exclusions or 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_dnsfilter_profilesB

List DNS filter profiles in an ADOM.

DNS filter profiles control FortiGuard DNS category rating actions, botnet C&C domain blocking, and DNS-level safe search.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Profile list with keys: - status: "success" or "error" - count: Number of profiles - profiles: List of DNS filter profile objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It indicates a read-oriented listing operation, documents the default ADOM source, and lists return keys including status, count, profiles, and error message. However, it does not explicitly state permission requirements, rate limits, pagination behavior, or side-effect guarantees.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then organized into Args and Returns sections. It is generally efficient, though the Returns section is somewhat redundant because an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter list tool, the description covers purpose, both parameters, default behavior, and return structure. It is complete enough to invoke correctly, with only minor gaps such as pagination or ordering behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It explains that adom defaults from DEFAULT_ADOM or 'root' and that name_filter performs a partial-match name filter, adding meaningful semantics not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List DNS filter profiles in an ADOM.' It also gives useful domain context about what DNS filter profiles control. It does not explicitly contrast the tool with the sibling get_dnsfilter_profile, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by naming the resource and its arguments, but it gives no explicit guidance on when to choose this tool over get_dnsfilter_profile or other search/list tools. There are no exclusions, prerequisites, or alternative-routing instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_firewall_policiesA

List firewall policies in a policy package.

Args: adom: ADOM name package: Policy package name fields: Specific fields to return (optional) limit: Maximum number of policies to return (optional) offset: Starting position for pagination (default: 0)

Returns: dict: Policy list with keys: - status: "success" or "error" - count: Number of policies returned - total: Total number of policies in package - policies: List of policy objects - message: Error message if failed

Example: >>> # Get all policies >>> result = await list_firewall_policies("root", "default")

>>> # Get first 10 policies with specific fields
>>> result = await list_firewall_policies(
...     adom="root",
...     package="default",
...     fields=["policyid", "name", "srcaddr", "dstaddr", "action"],
...     limit=10
... )
NameRequiredDescriptionDefault
adomYes
limitNo
fieldsNo
offsetNo
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It details the return dict structure (status, count, total, policies, message) and pagination parameters (limit, offset) with examples. However, it does not explicitly state that the operation is read-only or safe, nor does it mention authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with Args, Returns, and Example sections. Every sentence is informative, no redundancy, and it is appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters, no annotations, and an output schema (though not detailed), the description covers input semantics, output structure, and provides examples. It fully addresses the agent's needs for a list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully explains each parameter (adom, package, fields, limit, offset) with context and usage examples. It adds significant value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List firewall policies in a policy package,' specifying the verb (list), resource (firewall policies), and scope (policy package). This distinguishes it from siblings like get_firewall_policy (single), search_firewall_policies (filtered), and mutation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives like search_firewall_policies or get_firewall_policy. The description implies it lists all policies in a package, but does not clarify use cases or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_firmware_imagesA

List firmware image files stored on the FortiManager's local disk.

These are the files already imported by an administrator and/or downloaded from FortiGuard -- a subset of what list_available_firmware reports, scoped to what FortiManager could push without first fetching it from FortiGuard.

Args: system: Product code to filter by, e.g. "FMG", "FGT" (optional; FortiManager returns every stored image when omitted or when there's no match for the given code)

Returns: dict: Local image list with keys: - status: "success" or "error" - image_list: List of {platform, product, version, build, date, image_path, image_size} - message: Error message if failed

NameRequiredDescriptionDefault
systemNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the burden, and it does well: it discloses the non-obvious filter fallback (returns every stored image when the code is omitted OR when there is no match) and names the error key. It does not state read-only characteristics explicitly or any permission requirements, which is the remaining gap for a zero-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the sibling comparison, then the arg and return details. The Returns section partly restates what the output schema already declares, which is mild redundancy, though the section's structure (status/image_list/message) stays tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, the one parameter's semantics including its fallback, and the shape of the result, so an agent can call it correctly. What remains unstated — read-only/auth assumptions and whether results span ADOMs — is minor for a simple list operation with an output schema present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: the single `system` param is documented as a product code with concrete examples ("FMG", "FGT"), marked optional, and given its no-match fallback behavior, which is far beyond the bare `string|null` schema. Only format/case-sensitivity details are missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List firmware image files stored on the FortiManager's local disk") and immediately positions it against a named sibling by describing itself as "a subset of what list_available_firmware reports." An agent can distinguish local-cached images from FortiGuard-available images without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the selection context clearly — this tool covers files already imported/downloaded and pushable without fetching, implying list_available_firmware is for the broader catalog. It lacks an explicit "use X instead when..." directive, but the comparative framing gives an agent enough to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ips_sensorsA

List IPS sensors in an ADOM.

IPS sensors are collections of intrusion-prevention signature filters and overrides, referenced by firewall policies for the "IPS" security profile.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Sensor list with keys: - status: "success" or "error" - count: Number of sensors - sensors: List of IPS sensor objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It does describe the return payload keys (status, count, sensors, message), which is useful behavioral context, but it says nothing about permissions required, pagination or result-size limits, or whether the listing is read-only — all relevant for a list tool that could return large result sets.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, followed by a short domain gloss and clean Args/Returns sections. Every section earns its place, though the Returns block largely duplicates the existing output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Parameters and return shape are well covered, and an output schema exists so return values needn't be explained. However, with no annotations at all, the description leaves behavioral questions (permissions, pagination, ordering) unanswered for a list operation over a potentially large object set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and both parameters have null defaults, so the description must compensate — and it does. It explains that adom falls back to the DEFAULT_ADOM env var or 'root', and that name_filter is a partial-match filter, neither of which is inferable from the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb and resource ('List IPS sensors') scoped to an ADOM, and the follow-up sentence explains what an IPS sensor is. It distinguishes itself from mutation siblings like create_ips_sensor or delete_ips_sensor by the verb, though it never explicitly contrasts with get_ips_sensor for single-item retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and the ADOM scoping, but there is no explicit when-to-use guidance, no statement of prerequisites, and no pointer to get_ips_sensor for detailed retrieval of a single sensor. An agent must infer the boundary from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ips_sensor_signature_overridesA

List the signature-filter/override entries of an IPS sensor.

Each entry is either a broad filter (matched by severity/protocol/OS/...) or a specific signature override (matched by an explicit "rule" list of signature names). Use the returned "id" values with remove_ips_sensor_signature_override.

Args: adom: ADOM name sensor: IPS sensor name

Returns: dict: Entry list with keys: - status: "success" or "error" - count: Number of entries - entries: List of entry objects - message: Error message if failed

NameRequiredDescriptionDefault
adomYes
sensorYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden, and it does disclose the response contract: a dict with status, count, entries and an error message, plus the two distinct entry shapes. It could go further on permissions or behavior when the sensor has no overrides, but the read-only nature is unambiguous from "List" and the downstream id guidance adds real context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then the entry-type explanation, the sibling hand-off, and compact Args/Returns blocks. Well structured, though the Returns block partly duplicates the existing output schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool this covers what an agent needs: what is listed, what the entries mean, how to use the ids, and what comes back. The only soft spot is the shallow parameter glosses, which matters little given only two required string inputs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does enumerate both parameters under Args, but the glosses ("ADOM name", "IPS sensor name") largely restate the parameter names without adding format, scope, or whether `sensor` is a name versus an object identifier — leaving a real gap for a zero-coverage schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("List") and resource ("signature-filter/override entries of an IPS sensor") and explains what an entry actually is — either a broad severity/protocol/OS filter or an explicit signature-name rule. That distinguishes it cleanly from get_ips_sensor, add_ips_sensor_signature_override and remove_ips_sensor_signature_override.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent downstream: "Use the returned 'id' values with remove_ips_sensor_signature_override," which tells the caller when this tool is a prerequisite rather than a terminal action. It stops short of stating exclusions (e.g., when to read the parent sensor instead), so it is clear context without full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_local_in_policiesA

List IPv4 local-in policies in a policy package.

Local-in policies control access to the FortiGate's own management plane (GUI, SSH, ping, API, SNMP, etc.), not through-traffic.

Args: adom: ADOM name package: Policy package name fields: Specific fields to return (optional) limit: Maximum number of policies to return (optional) offset: Starting position for pagination (default: 0)

Returns: dict: Policy list with keys: - status: "success" or "error" - count: Number of policies returned - total: Total number of local-in policies in package - policies: List of local-in policy objects - message: Error message if failed

Example: >>> result = await list_local_in_policies("root", "default")

NameRequiredDescriptionDefault
adomYes
limitNo
fieldsNo
offsetNo
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does reasonably well: it implies a safe read, documents the response keys including count/total and error status, and notes pagination via offset. It does not cover permissions or what happens with invalid ADOM/package, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose statement followed by a scoping note, parameter list, and example. The Returns block duplicates information the output schema already provides, which is mild waste, but overall the structure is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return-value section is largely redundant, but the parameter explanations and the example call make the definition self-sufficient for a five-parameter list tool. Missing only guidance on sibling selection and error conditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does by naming all five parameters and their intent (fields = specific fields to return, limit = max results, offset = starting position). It lacks detail on accepted field-name syntax or type constraints, which prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List IPv4 local-in policies in a policy package') and immediately scopes it against the sibling concept of through-traffic policies. The 'IPv4' qualifier also implicitly separates it from list_local_in_policies6.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence explaining that local-in policies control the FortiGate management plane gives useful context on what data this covers, but there is no explicit guidance on when to use this versus get_local_in_policy or the IPv6 variant, and 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_local_in_policies6A

List IPv6 local-in policies in a policy package.

Local-in policies control access to the FortiGate's own management plane (GUI, SSH, ping, API, SNMP, etc.) over IPv6, not through-traffic.

Args: adom: ADOM name package: Policy package name fields: Specific fields to return (optional) limit: Maximum number of policies to return (optional) offset: Starting position for pagination (default: 0)

Returns: dict: Policy list with keys: - status: "success" or "error" - count: Number of policies returned - total: Total number of local-in policies6 in package - policies: List of local-in policy6 objects - message: Error message if failed

Example: >>> result = await list_local_in_policies6("root", "default")

NameRequiredDescriptionDefault
adomYes
limitNo
fieldsNo
offsetNo
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the burden. It signals a read-only list operation and discloses pagination via limit/offset, but says nothing about permissions required, whether the package must be locked, or behavior for empty/invalid packages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then a one-line scope clarification, then grouped Args/Returns/Example sections. Nothing is padded; each block maps to a distinct need.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the Returns block is partly redundant, but it is harmless and the Args gloss plus the scope note make the definition callable without further lookups. Only missing piece is any prerequisite or authorization context for reading a policy package.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: every one of the 5 params is glossed (fields = specific fields to return, limit = max results, offset = starting position for pagination default 0). 'adom' and 'package' are only restated by name, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List IPv6 local-in policies in a policy package') and immediately clarifies scope: management-plane access over IPv6, not through-traffic. This lets an agent distinguish it from list_local_in_policies (IPv4) and from firewall policy siblings without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The domain explanation implies when the tool is relevant, but there is no explicit instruction on when to use this instead of list_local_in_policies, get_local_in_policy6, or get_firewall_policy. The IPv4/IPv6 split is left to inference from the name and the word 'IPv6'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_packagesA

List all policy packages in an ADOM.

Policy packages contain firewall policies, security profiles, and other configurations to be installed on managed devices.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root")

Returns: dict: Package list with keys: - status: "success" or "error" - count: Number of packages - packages: List of package objects - message: Error message if failed

Example: >>> result = await list_packages("root") >>> for pkg in result["packages"]: ... print(f"{pkg['name']}: {pkg.get('type', 'policy')}")

NameRequiredDescriptionDefault
adomNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes the return format and mentions status, error messages, and the default ADOM, but does not disclose side effects, authentication needs, or rate limits. The behavior is adequately described for a list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, context, Args, Returns, and an Example. The explanation of policy packages is slightly verbose but adds useful context. Overall, it is concise and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (list with one optional parameter) and the presence of an output schema (implied), the description covers all necessary aspects: what it does, what parameters to use, and what is returned, including error handling and an example.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the description adds full semantic meaning for the 'adom' parameter, including default behavior (from env var or 'root'). This compensates completely for the missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all policy packages in an ADOM' with a specific verb and resource, and explains what policy packages are. This distinguishes it from sibling tools like create_package or get_package.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating it lists all packages in an ADOM, but does not explicitly provide guidance on when to use it versus alternatives (e.g., get_package for a single package) or mention any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_packet_capturesA

List existing FortiManager packet capture definitions.

Returns the packet capture (sniffer) definitions configured on the FortiManager itself, for traffic originating or destined to the FMG. These are configuration records, not live capture results -- use get_packet_capture_status() for running/packet-count state.

Returns: dict: Capture list with keys: - status: "success" or "error" - count: Number of capture definitions - captures: List of capture objects (id, interface, host, port, protocol, vlan, ipv6, non-ip, max-packet-count) - message: Error message if failed

Example: >>> result = await list_packet_captures() >>> for cap in result["captures"]: ... print(f"{cap['id']}: {cap['interface']}")

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does so well: it discloses that these are configuration records rather than live capture results, and scopes them to FMG-local traffic rather than device traffic — a distinction an agent could easily get wrong. It omits any statement about read-only safety or volume/ordering of the returned list, which is the residual gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core disambiguation is front-loaded in the first two sentences and every sentence there earns its place. The trailing 'Returns' block and doctest example are somewhat verbose given an output schema already exists, but they are structured and skimmable rather than rambling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument list tool with an output schema, the description covers the real ambiguity — definition records vs. live capture state, FMG-local vs. device scope. The Returns block partially duplicates the output schema, so it adds bulk rather than completeness, but nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to compensate for, and the per-capture field list it mentions is extra context rather than a substitute for missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List existing FortiManager packet capture definitions') and immediately narrows the scope: captures configured on the FMG itself, for traffic to/from the FMG, not device-level sniffer configs. It explicitly separates itself from get_packet_capture_status(), so the agent can distinguish it from its closest sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit conditional routing rule: use get_packet_capture_status() when you want running/packet-count state, this tool when you want the definitions. That is a clear when/when-not pair. It does not mention the other capture-related siblings (add_packet_capture, start_packet_capture, stop_packet_capture, create_device_sniffer), which would be the natural remaining confusion points, so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_policy_revisionsA

List the change log for a policy package's firewall policies.

Args: adom: ADOM name package: Policy package name policyid: Limit to one policy's change history (optional; all policies in the package if omitted)

Returns: dict: status, adom, package, policyid, count, changes -- each entry has act (1=created, 2=deleted, 3=modified), key (the policyid), config (a JSON-encoded policy snapshot at that change -- pass straight to revert_firewall_policy), timestamp, user

Example: >>> result = await list_policy_revisions("demo", "ppkg_001", policyid=14) >>> first_change = result["changes"][0] >>> await revert_firewall_policy("demo", "ppkg_001", first_change["config"])

NameRequiredDescriptionDefault
adomYes
packageYes
policyidNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden well by explaining the return fields, change action codes, and that config is a JSON snapshot suitable for revert_firewall_policy. It does not mention permissions, rate limits, or other operational constraints, but it is strong for a read-only listing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and well structured with Args, Returns, and an example. The example is useful rather than filler, though the returns section is somewhat detailed relative to the core listing operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema, the description still adds useful return semantics such as act codes and config snapshot behavior. Together with parameter guidance and a revert example, it gives an agent enough context to call and use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: adom and package are described, and policyid is explicitly marked optional with the behavior when omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: listing the change log for a policy package's firewall policies. It also scopes the result to a package and optionally a policy, distinguishing it from broader revision tools like list_adom_revisions and list_device_revisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the optional policyid behavior and demonstrates a workflow with revert_firewall_policy, so the intended use case is clear. However, it does not explicitly say when to choose this over related tools such as diff_policy_package or list_adom_revisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scriptsA

List CLI scripts in an ADOM.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") script_type: Filter by type (cli, tcl, cligrp, tclgrp, jinja) target: Filter by target (device_database, remote_device, adom_database) limit: Maximum number of scripts to return

Returns: List of scripts with name, type, target, and description

NameRequiredDescriptionDefault
adomNo
limitNo
targetNo
script_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses the return format (list of scripts with fields) and default ADOM behavior. However, it does not mention permissions, rate limits, or edge cases (e.g., empty results). Annotations would have raised the baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief (5 sentences) with a clear structure: one-line purpose, Args list, Returns summary. No unnecessary words. Front-loaded with the action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool and the presence of an output schema, the description covers purpose, parameters, and return structure. It lacks error handling info but is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description fully documents all 4 parameters: default ADOM from env var, enumerated script_type values, enumerated target values, and limit meaning. This adds substantial meaning beyond the schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List CLI scripts in an ADOM', using a specific verb and resource. It distinguishes from other listing tools (e.g., list_addresses, list_devices) and is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is provided on when to use this tool vs alternatives (e.g., get_script for a single script, or search_objects). No when-not-to-use or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sdwan_templatesA

List SD-WAN templates in an ADOM.

SD-WAN templates define WAN interface configurations, performance SLAs, and traffic steering rules for SD-WAN deployments.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") limit: Maximum number of templates to return

Returns: List of SD-WAN templates with name, type, and assigned devices

NameRequiredDescriptionDefault
adomNo
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It explains the default ADOM from env var and the limit parameter, but does not disclose potential side effects, errors, or that it is a read-only operation. Provides return format but not behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the core purpose, and structured with Args/Returns. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema, the description provides necessary context about the return fields. It covers the core operation, parameters, and return format. Missing details on error handling or differentiation from other list tools, but sufficient for a straightforward list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds meaningful semantics for both parameters: 'adom' with default source, 'limit' with purpose. This compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List SD-WAN templates in an ADOM' with a specific verb and resource, and context about what SD-WAN templates are. This distinguishes it from siblings like get_sdwan_template, create_sdwan_template, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives like list_templates or get_sdwan_template. The description only states what it does without suggesting when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_service_groupsA

List service groups in an ADOM.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Group list with keys: - status: "success" or "error" - count: Number of groups - groups: List of service group objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description describes the return structure (dict with status, count, groups, message) but does not disclose potential side effects, performance characteristics, or whether pagination is supported. The disclosure of defaults and partial match behavior adds some value, but overall transparency is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear one-line summary, followed by structured Args and Returns sections. While slightly verbose, every sentence serves a purpose. The repetition of parameter names from schema is acceptable given the added semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's two optional parameters and the presence of a return schema, the description covers the core functionality and parameter behavior. However, it lacks guidance on when to prefer this list operation over the 'get_service_group' tool, and does not address potential edge cases like empty results or pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage. The description adds meaningful detail: adom's default value (from env var or 'root') and name_filter's partial match behavior. This compensates for the schema's lack of documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' and resource 'service groups' scoped to 'an ADOM', distinguishing it from sibling tools like 'get_service_group' (single retrieval) and 'list_services' (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives such as 'get_service_group' or 'list_services'. Usage is implied by the description but lacks context for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_servicesA

List custom service objects in an ADOM.

Service objects define network protocols and ports used in policies.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match) protocol_filter: Filter by protocol ("TCP/UDP/SCTP", "ICMP", "IP")

Returns: dict: Service list with keys: - status: "success" or "error" - count: Number of services - services: List of service objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo
protocol_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description implies read-only via 'list' verb and describes return format, but does not explicitly state lack of side effects or error details beyond message field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with opening line, parameter list, and return format. Slightly verbose in return dict description, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all needed aspects: purpose, parameters (with defaults and filters), return format. Output schema exists but description already details returns. No gaps for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds meaning: explains adom default, partial match for name_filter, and enumerated protocol options for protocol_filter. Adds value beyond schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List custom service objects in an ADOM' and defines the resource. Distinguishes from siblings like list_service_groups by focusing on service objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this vs alternatives like list_service_groups or list_addresses. Usage is implied for listing services, but not contextualized.

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 in an ADOM.

SSL/SSH inspection profiles control how a FortiGate decrypts and inspects TLS/SSH traffic, referenced by firewall policies for the "SSL/SSH Inspection" security profile.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Profile list with keys: - status: "success" or "error" - count: Number of profiles - profiles: List of SSL/SSH profile objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the ADOM default resolution chain and the exact return keys including error status/message, which is genuinely useful. It says nothing about pagination, result limits, required permissions, or whether the operation is strictly read-only (only implied by 'List').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in one sentence, followed by compact domain context and structured Args/Returns blocks. The Returns block partially duplicates the existing output schema, so it is slightly longer than necessary, but nothing is bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema, this covers the essentials: both parameters are explained and the return shape is restated. The main remaining gap is behavioral context (permissions, pagination, ADOM lock state) that no annotation supplies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate — and it does, explaining that adom defaults to the DEFAULT_ADOM env var or 'root' and that name_filter is a partial match. Both parameters gain meaning absent from the bare schema, though no format examples are given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List SSL/SSH inspection profiles in an ADOM') and adds domain context explaining what these profiles do. An agent can distinguish it immediately from get_ssl_ssh_profile, create_ssl_ssh_profile, and the other SSL/SSH siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The listing intent is implied by 'List ... in an ADOM' and the note that profiles are referenced by firewall policies gives useful context. However, there is no explicit guidance on when to use this versus get_ssl_ssh_profile for a single profile, nor any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_system_templatesA

List system templates (device profiles) in an ADOM.

System templates configure device settings like DNS, NTP, logging, etc.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") limit: Maximum number to return

Returns: List of system templates with name, type, and assigned devices

NameRequiredDescriptionDefault
adomNo
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explains the default ADOM behavior and return fields (name, type, assigned devices), but does not mention idempotency, pagination behavior beyond the limit parameter, or any rate limits/authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded, and every sentence provides value. It efficiently covers purpose, parameter details, and return values without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (list with 2 optional params, output schema exists), the description covers purpose, parameter semantics, and return fields adequately. It could mention if there is any filtering beyond ADOM, but it is sufficiently complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description compensates by explaining the adom parameter's default derivation and the limit as maximum number. This adds meaning beyond the bare schema properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists system templates (device profiles) in an ADOM, using a specific verb and resource. However, it does not differentiate from sibling tools like list_templates or list_sdwan_templates, which could be ambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives is provided. The description lacks any 'when to use' or 'when not to use' context, leaving the agent to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tasksA

List all tasks in FortiManager.

Tasks represent background operations like policy installation, device provisioning, and other long-running processes.

Args: filter_state: Filter by task state (optional): - "pending": Not started - "running": Currently executing - "done": Completed - "error": Failed - "cancelling": Being cancelled - "cancelled": Cancelled

Returns: dict: Task list with keys: - status: "success" or "error" - count: Number of tasks - tasks: List of task objects with id, state, progress, etc. - message: Error message if failed

Example: >>> # Get all tasks >>> result = await list_tasks()

>>> # Get only running tasks
>>> result = await list_tasks(filter_state="running")
NameRequiredDescriptionDefault
filter_stateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes return format and filter behavior, but does not mention potential limits (e.g., pagination) or side effects. Without annotations, the description carries the burden; it's adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with Args, Returns, and Example sections. It is concise with no redundant information, fitting the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity and presence of an output schema, the description covers all needed aspects: purpose, parameter, return format, and an example. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description fully documents the sole parameter filter_state, listing all valid enum values with clear descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all tasks in FortiManager' and explains tasks as background operations, distinguishing it from siblings like get_task (single task) and wait_for_task (waiting).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides usage context with optional filter_state parameter and an example. Lacks explicit when-not-to-use or alternatives, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_template_groupsA

List template groups in an ADOM.

Template groups combine multiple templates (system, CLI, SD-WAN, etc.) into a single package for device assignment.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") limit: Maximum number to return

Returns: List of template groups

NameRequiredDescriptionDefault
adomNo
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. It discloses the adom default behavior and limit parameter, and the operation is inherently read-only. However, it does not explicitly state safety or side effects, but the simplicity justifies a high score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with Args and Returns sections. Every sentence earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description adequately covers purpose, parameters, and return. No additional context needed for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds significant meaning: it explains adom default from env var and limit as maximum number to return, far exceeding the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List template groups in an ADOM' and explains what template groups are, distinguishing them from individual templates. Sibling tools like list_templates and list_cli_template_groups confirm differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides basic usage context but does not explicitly compare to alternatives or state when not to use this tool. It implies usage for listing but lacks exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesA

List all provisioning templates in an ADOM.

Returns all template types: IPsec, BGP, system, etc.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") limit: Maximum number of templates to return

Returns: List of templates with name, type, and settings

NameRequiredDescriptionDefault
adomNo
limitNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is transparent about being a read-only listing operation. It does not contradict any annotations (none provided) and discloses the return format. For a simple list tool, this is adequate behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-line summary, followed by details in an Args/Returns format. Every sentence adds value, and there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, parameters with defaults, and return format. Given it's a list tool with an output schema, it provides sufficient context for correct invocation, though it could mention whether results are paginated or ordered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description adds meaningful context for both parameters: adom (with default behavior) and limit (maximum count). It also explains the return structure. This compensates well for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all provisioning templates in an ADOM, returning all types. It distinguishes itself from siblings like list_sdwan_templates and list_system_templates by specifying it covers all types, making its scope immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains it returns all template types, implying it's the general list tool. However, it does not explicitly state when to use it over type-specific lists (e.g., if only IPsec templates are needed). Still, the context provides enough guidance for appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_waf_profilesA

List WAF (Web Application Firewall) profiles in an ADOM.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Profile list with keys: - status: "success" or "error" - count: Number of profiles - profiles: List of WAF profile objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the load and does reasonably well: it discloses the ADOM default resolution chain (env var DEFAULT_ADOM, then 'root'), the partial-match nature of filtering, and the exact return shape including the error key. It omits permission requirements and whether results are paginated, but for a read-only list operation the residual risk is low.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded, and the Args/Returns blocks are compact and skimmable with zero filler prose. Every line conveys a distinct fact about invocation or output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter read tool, the description covers both inputs and the return contract. Since an output schema already exists, the Returns block is somewhat redundant, and there is no explicit note on large result sets or ordering, leaving a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must supply all parameter meaning and it does: adom is documented with its default fallback chain, and name_filter is documented as a partial match. This is meaningfully beyond the bare 'Adom'/'Name Filter' titles in the schema, though it gives no format examples or case-sensitivity detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('List WAF (Web Application Firewall) profiles in an ADOM') and even expands the acronym, so it is unmistakable against siblings like get_waf_profile, create_waf_profile, or delete_waf_profile. It stops short of explicitly naming those alternatives, so it is clear but not fully sibling-differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb and by the presence of a name_filter, but there is no statement about when to use this versus get_waf_profile (single fetch) or when to skip the ADOM argument. An agent can infer the list-vs-get distinction from naming conventions alone, which is the definition of minimum-viable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webfilter_profilesA

List web filter profiles in an ADOM.

Web filter profiles define URL category rating actions, FortiGuard web filtering behavior, and related web-content controls.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by name (partial match)

Returns: dict: Profile list with keys: - status: "success" or "error" - count: Number of profiles - profiles: List of web filter profile objects - message: Error message if failed

NameRequiredDescriptionDefault
adomNo
name_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It discloses the return shape (status/count/profiles/message) and the fact that errors come back as status='error' with a message rather than raising, which is useful. It does not state that the operation is read-only/no-mutation, nor anything about pagination, result-size limits, or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, followed by brief context, then Args and Returns sections. Everything earns its place, though the Returns block partially duplicates the existing output schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter list tool with no annotations, the description supplies the ADOM default resolution, filter semantics, and error-shape behavior, which is enough to call it correctly. The existence of an output schema makes the verbose Returns listing redundant rather than harmful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate — and it does: 'adom' is documented with its resolution order (DEFAULT_ADOM env var, then 'root'), and 'name_filter' is documented as a partial-match name filter. That is meaningful semantics beyond the bare 'string/null' schema. Only the matching rule details (case sensitivity) are missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List web filter profiles in an ADOM') and adds a one-line gloss on what a web filter profile is (URL category rating, FortiGuard behavior). It does not explicitly contrast with siblings like get_webfilter_profile or list_dnsfilter_profiles, but the name plus gloss is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the purpose and the 'default: from DEFAULT_ADOM env var, or root' note, which tells the agent the ADOM argument is optional. There is no explicit when-to-use vs when-not, and no mention of the sibling get_webfilter_profile for single-object retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lock_adomA

Lock an ADOM for editing (workspace mode).

In workspace mode, ADOMs must be locked before making changes. This prevents conflicts from multiple administrators editing the same ADOM simultaneously.

Args: adom: ADOM name to lock

Returns: dict: Lock result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await lock_adom("root") >>> if result["status"] == "success": ... # Make changes... ... await commit_adom("root") ... await unlock_adom("root")

NameRequiredDescriptionDefault
adomYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses the basic behavior (locks ADOM, returns status/message) and includes a usage pattern. It does not specify idempotency or error handling for already locked ADOMs, but for a simple lock tool, the description is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient: a brief one-sentence purpose, then structured Args/Returns/Example. Every part adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and the presence of sibling unlock_adom and commit_adom, the description provides a complete workflow. The return format is defined, and the example illustrates typical usage. No output schema needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, and the description adds clear meaning: 'ADOM name to lock'. The single parameter is well-defined, and the example shows usage with 'root'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Lock an ADOM for editing' using a specific verb and resource. It distinguishes from siblings like unlock_adom by specifying 'workspace mode' and the prerequisite for changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use: 'In workspace mode, ADOMs must be locked before making changes' and hints at conflict prevention. It provides an example that includes commit_adom and unlock_adom, implying a workflow, but does not explicitly state when not to use or list alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_firewall_policyA

Move a firewall policy to a new position.

Reorders a policy relative to another policy in the rule list. Policy order determines evaluation priority.

Args: adom: ADOM name package: Policy package name policyid: Policy ID to move target_policyid: Reference policy ID position: Where to place - "before" or "after" (default: "before")

Returns: dict: Move result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> # Move policy 10 before policy 5 >>> result = await move_firewall_policy( ... adom="root", ... package="default", ... policyid=10, ... target_policyid=5, ... position="before" ... )

NameRequiredDescriptionDefault
adomYes
packageYes
policyidYes
positionNobefore
target_policyidYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description provides key behavioral details: it reorders policies and returns a status/error dict. It could mention potential side effects like policy validation, but the explanation is adequate for a reordering tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a concise summary line, a brief explanation, then organized sections for Args, Returns, and an Example. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple move operation with no output schema, the description covers purpose, parameters, return format, and usage example. It is self-contained and sufficient for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description thoroughly documents all five parameters in Args, including default for 'position', and provides a concrete example. This adds significant meaning beyond the basic schema types and titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Move a firewall policy to a new position') and the resource ('firewall policy'). It explains that reordering changes evaluation priority, which distinguishes it from other policy tools like create, update, or delete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (to reorder a policy relative to another) and how position affects priority. While it doesn't explicitly state when not to use it or list alternatives, the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

policy_lookupA

Simulate a firewall policy lookup for a traffic 5-tuple against a managed device.

Proxies FortiGate's policy-lookup monitor API through FortiManager to ask "which policy would match this traffic right now" -- the same operation the FortiManager UI's Policy Lookup dialog performs. This queries the device's currently installed/active policy; it does not take a policy-package argument (the documented endpoint has none -- see module docstring).

Args: adom: ADOM name device: Managed device name (e.g. "FGT-HQ"). Accepts the "device[vdom]" bracket suffix used elsewhere in this codebase to target a specific VDOM. dest: Destination IPv4 address to test (e.g. "8.8.8.8") protocol: IP protocol number to test -- 6=TCP, 17=UDP, 1=ICMP, 47=GRE, 50=ESP, 51=AH, 58=ICMPv6, 132=SCTP. Sent to the device as both the protocol and protocol_number query fields, mirroring the one documented request/response pair in the How-To Guide where both fields carried the same value; the guide does not show a case where they differ. srcintf: Ingress interface name the traffic would arrive on (e.g. "internal"). Optional -- omitted from the query when not given, matching the FortiGate monitor API default. sourceip: Source IPv4 address to test (optional; omitted from the query when not given -- the How-To Guide's own example queried with this field empty) sourceport: Source port to test (optional; omitted when not given) destport: Destination port to test (optional; 0 -- "any port", per the How-To Guide example -- when not given) package: Informational only, NOT sent to the device. The FortiGate policy-lookup endpoint has no package selector; it always reflects whatever package is currently installed. Pass this if you want it echoed back (as package_hint) in the result to cross-check against what you expect to be installed.

Returns: dict: Lookup result with keys: - status: "success" or "error" - adom, device - package_hint: the caller-supplied package argument, echoed back unverified -- NOT confirmation that this package is what actually matched (named package_hint, not package, so it can't be misread as verified match data) - query: the traffic-tuple fields actually sent to the device - matched: bool from the device's results.success field when present, else None (the How-To Guide only documents the no-match case: {"success": false}; a positive match's full field set is not documented here, so it is not reshaped -- see result) - result: the raw results payload returned by the device, passed through unchanged - message: Error message if failed

Example: >>> result = await policy_lookup( ... adom="root", ... device="branch1_fgt", ... srcintf="vl_lan", ... protocol=6, ... dest="8.8.8.8", ... ) >>> result["matched"] False

NameRequiredDescriptionDefault
adomYes
destYes
deviceYes
packageNo
srcintfNo
destportNo
protocolYes
sourceipNo
sourceportNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations, the description carries the full burden and delivers: it discloses that it proxies a FortiGate monitor API through FortiManager, is a query against the currently installed policy, that `package` is informational and not sent, and that `matched` may be None because only the no-match case is documented. It also flags that positive-match field sets are passed through unreshaped, avoiding overpromising.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, and Args/Returns/Example structure makes it skimmable. It is somewhat verbose in places — the How-To Guide meta-commentary on protocol/protocol_number and the repeated package_hint caveat could be trimmed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers everything an agent needs for a 9-param, 9-field-output tool: parameter semantics, required vs optional behavior, return-shape caveats, and a worked example. It over-delivers by documenting the return dict even though an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it documents all 9 params: protocol with concrete enum values (6=TCP, 17=UDP, etc.), the "device[vdom]" suffix convention, which fields are omitted when unset and the device-default implications, and the subtle package/package_hint distinction. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Simulate a firewall policy lookup for a traffic 5-tuple against a managed device") and clarifies the semantics: which policy would match this traffic right now, on the currently installed package. This meaningfully separates it from the many config-oriented policy siblings (get_firewall_policy, list_firewall_policies, search_firewall_policies), though none is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The use case (test a traffic tuple against the live device, like the UI's Policy Lookup dialog) is clearly conveyed, but there is no explicit when-not or named alternative (e.g., "use X to inspect policy config, use this to test matching"). It says it takes no policy-package argument but doesn't explain what to do instead when a specific package must be tested.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_installA

Preview installation changes before applying.

Shows what configuration changes would be made to devices without actually installing the package. Use this to verify changes before deployment.

Args: adom: ADOM name package: Policy package name (optional, preview device settings if None) devices: Target devices [{"name": "FGT1", "vdom": "root"}, ...]

Returns: dict: Preview result with keys: - status: "success" or "error" - task_id: Task ID for retrieving preview results - message: Status or error message

Example: >>> # Start preview >>> result = await preview_install( ... adom="root", ... package="default", ... devices=[{"name": "FGT-HQ", "vdom": "root"}] ... ) >>> # Wait for preview to complete, then get results >>> if result["status"] == "success": ... from fortimanager_mcp.tools.system_tools import wait_for_task ... await wait_for_task(result["task_id"]) ... preview = await get_preview_result(...)

NameRequiredDescriptionDefault
adomYes
devicesYes
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It clearly states the tool is a non-destructive preview, shows what changes would be made, and describes the return structure. It does not mention authentication or rate limits, but these are less critical for a preview tool. The async nature is hinted through the example but not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary, parameter docs, return block, and example. It is not overly verbose; each section adds value. Slight improvement possible by removing the example's explicit wait_for_task import, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and moderate complexity, the description covers the tool's purpose, parameters, return schema, and a usage example. It connects to sibling tools (install_package, get_preview_result) implicitly through the workflow. It could explicitly mention the async nature and error handling, but the provided information is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the schema: it explains the purpose of each parameter (adom: ADOM name, package: optional, devices: list of dicts with name and vdom). This compensates for the 0% schema coverage. However, there is a minor contradiction: the schema marks package as required, but the description says 'optional, preview device settings if None', which could confuse agents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to preview installation changes before applying, without actually installing. It uses specific verbs and resources (preview, installation changes, devices) and distinguishes itself from sibling tools like install_package and get_preview_result through the description and example workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to verify changes before deployment', indicating when to use. The example workflow further clarifies the sequence (preview, wait for task, get results). However, it does not explicitly exclude alternatives or state when not to use, which would improve guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reload_device_listA

Reload the device list from FortiManager database.

Forces FortiManager to refresh its device cache. Useful after direct database changes or if device list appears stale.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root")

Returns: dict: Reload result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that it forces a cache refresh, implying a write operation with potential side effects. It mentions return status and message, but does not detail permissions or impacts. Given no annotations, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear title, usage note, and separate sections for args and returns. Every sentence adds value; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage context, parameter semantics, and return structure. It is fully self-contained and complete for a simple tool with one optional parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant value beyond the schema by explaining the adom parameter's default (from DEFAULT_ADOM env var or 'root'). With 0% schema coverage, this is essential and well-provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reloads the device list from FortiManager database, forcing a cache refresh. It distinguishes from siblings like list_devices and add_device by focusing on refreshing existing data rather than listing or adding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Useful after direct database changes or if device list appears stale', providing clear when-to-use guidance. However, it does not mention when not to use or explicitly compare with alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_device_from_groupA

Remove a single device from a device group.

Args: adom: ADOM name group: Device group name device: Device name to remove vdom: Device VDOM to remove (default: "root")

Returns: dict: Remove result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await remove_device_from_group("root", "Branch-Firewalls", "FGT-Branch1")

NameRequiredDescriptionDefault
adomYes
vdomNoroot
groupYes
deviceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully clarifies that this removes one device from a group rather than deleting the device, and it documents the returned status/message, but it does not state permissions, prerequisites, side effects if the device is not a member, or whether the operation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then provides compact Args, Returns, and Example sections. It is appropriately sized and every section contributes useful information for invoking the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a focused membership mutation, and the description covers its parameters, default VDOM behavior, and return status. Because an output schema exists, it does not need to over-explain return values; the main missing context is validation behavior and any permission or lock requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the Args section documents all four parameters meaningfully: adom, group, device, and vdom with its default of 'root.' It compensates well for the schema gap, though it does not add constraints such as whether the VDOM must match an existing group membership.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: removing a single device from a device group. The word 'single' also helps distinguish it from bulk membership-removal siblings such as remove_devices_from_group_bulk.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended operation clear by saying 'single device,' which implies a contrast with bulk removal. However, it does not explicitly name the bulk alternative or state when/when not to use this tool versus remove_devices_from_group_bulk or remove_group_from_group.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_devices_from_group_bulkA

Remove multiple devices from a device group in one call.

Args: adom: ADOM name group: Device group name devices: List of device names to remove vdom: VDOM the devices were added on (default: "root")

Returns: dict: Remove result with keys: - status: "success" or "error" - requested_count: Number of devices in the request. NOT a count of memberships actually changed: FortiManager's DELETE on a non-member is a lenient no-op that still reports success, so a device that was never in the group is indistinguishable from one that was removed. - message: Status or error message

Example: >>> result = await remove_devices_from_group_bulk( ... "root", "Branch-Firewalls", ["FGT-Site1", "FGT-Site2"] ... )

NameRequiredDescriptionDefault
adomYes
vdomNoroot
groupYes
devicesYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the critical FortiManager gotcha that DELETE on a non-member is a lenient no-op reporting success, and clarifies that requested_count is not a count of actual membership changes. It documents return keys and status values. Missing only any note on permissions or reversibility, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line purpose, then organizes Args/Returns/Example cleanly. The Returns section is slightly verbose but the extra words on requested_count semantics are load-bearing; a small amount of terseness in args is the only minor cost.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations but an output schema, the description is largely complete: it explains params, return shape, and the no-op success caveat. It stops short of covering failure modes (nonexistent group) and permission requirements, leaving minor gaps for a bulk mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It lists all four args, but three are near-tautological restatements (adom='ADOM name', group='Device group name', devices='List of device names to remove'). Only vdom adds real meaning by noting the default ('root') and that it is the VDOM the devices were added on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: remove multiple devices from a device group in one call. The 'multiple' and 'bulk' framing distinguishes it from the singular remove_device_from_group and the inverse add_devices_to_group_bulk siblings without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'In one call' implies this is the batch path versus the singular remove_device_from_group, but the description never explicitly states when to use this versus that sibling, nor any preconditions (group must exist, devices must be in the ADOM/VDOM). Usage is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_group_from_groupB

Remove a nested group from its parent device group.

Args: adom: ADOM name parent_group: Group that currently contains child_group child_group: Nested group to remove from parent_group

Returns: dict: Remove result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await remove_group_from_group("root", "All-Branches", "Branch-Firewalls")

NameRequiredDescriptionDefault
adomYes
child_groupYes
parent_groupYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the burden: it makes clear this is a destructive membership change and documents the return keys (status/message), which is useful. It omits critical operational context for FortiManager mutations such as whether the ADOM must be locked first and what happens if child_group is not actually nested under parent_group.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in a single precise sentence, followed by compact Args/Returns/Example blocks. The Returns section partially duplicates the output schema, but overall there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-required-parameter nesting mutation, the definition covers what is removed and the result shape, and an output schema already exists so return detail is not required. Gaps remain around locking/permission requirements and whether removing a subgroup affects that group's own children or contents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the Args block is the only source: parent_group ('group that currently contains child_group') and child_group ('nested group to remove') add real relational meaning, and the example shows these are group names rather than IDs. However, adom is only glossed as 'ADOM name' with no format or enumeration guidance, so compensation for the 0% coverage is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: removing a nested group from its parent device group, which is distinguishable from siblings like add_group_to_group, remove_device_from_group, or delete_device_group. It never names those alternatives explicitly, so differentiation is implied by the resource rather than spelled out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Example block shows a concrete invocation, which implies the intended usage context, but nothing states when to use this versus add_group_to_group (inverse) or the bulk device-removal siblings. No prerequisites or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_ips_sensor_signature_overrideA

Remove a signature filter/override entry from an IPS sensor.

Use list_ips_sensor_signature_overrides to find the entry's "id" first if it is not already known.

Args: adom: ADOM name sensor: IPS sensor name entry_id: ID of the entry to remove (as returned in its "id" field)

Returns: dict: Remove result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
sensorYes
entry_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full behavioral burden. It implies a destructive mutation and describes the return shape, but it does not disclose irreversibility, required permissions, ADOM lock requirements, or other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and the list-first prerequisite, then uses compact Args and Returns sections. The Returns section is somewhat redundant because an output schema exists, but it does not obscure the core instructions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter removal tool with an output schema, the description provides the essential purpose, prerequisite, parameter meanings, and return keys. The main remaining gap is behavioral safety context around a destructive operation, but the definition is otherwise sufficient to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the Args section is important. It labels all three parameters and specifically explains that entry_id is the id returned by list_ips_sensor_signature_overrides, though the adom and sensor explanations are minimal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: removing a signature filter/override entry from an IPS sensor. It also distinguishes the operation from the sibling list_ips_sensor_signature_overrides by telling the agent to use that tool first when the entry id is unknown.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the key prerequisite: use list_ips_sensor_signature_overrides to find the entry id if it is not already known. It does not explicitly describe when not to use the tool or whether an ADOM lock is required, but the operational context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_datasourceA

Resolve the objects a config attribute is allowed to reference.

Generic config-DB introspection built on FortiManager's option: datasrc mechanism: given a cdb table url and an attribute name attr, FMG returns every object attr may reference. For example, the objects an SD-WAN service (steering) rule can point at -- internet-service-names, address groups, etc. Documented generically in the swagger cdb get-params (params.cdb.get.table.option.opts -> datasrc, requires attr).

Only pm/config endpoints are accepted -- arbitrary URLs are rejected.

Args: url: A cdb config path, e.g. "pm/config/adom/root/obj/system/sdwan" attr: The attribute whose referenceable objects to resolve, e.g. "internet-service-name" or "service" adom: ADOM name (informational; default: DEFAULT_ADOM env var or "root")

Returns: dict with keys: - url, attr, adom - datasource: raw list/dict of referenceable objects - error / error_code: on failure

NameRequiredDescriptionDefault
urlYes
adomNo
attrYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses the underlying FortiManager 'option: datasrc' mechanism, the pm/config-only restriction, and the failure shape (error/error_code). It never explicitly says the call is read-only/no side effects, which is the one behavioral trait left implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by clean Args/Returns blocks. The one piece of waste is the internal swagger cross-reference ('params.cdb.get.table.option.opts -> datasrc'), which documents the implementation rather than helping the agent call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param introspection tool with an output schema, the description covers purpose, all parameters, the endpoint restriction, and the error keys. The Returns block partially duplicates the output schema, but nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: url gets a concrete path example ('pm/config/adom/root/obj/system/sdwan'), attr gets two example values, and adom is explained as informational with its DEFAULT_ADOM/root default. This adds real meaning beyond the bare string types in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Resolve the objects a config attribute is allowed to reference') and immediately grounds it with a concrete example (SD-WAN service rule -> internet-service-names, address groups). No sibling tool in the list performs reference/datasource resolution, so the agent can distinguish it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the situation that calls for it (introspection of what an attribute may point at) and gives a hard exclusion: 'Only pm/config endpoints are accepted -- arbitrary URLs are rejected.' It does not name an alternative tool or a when-not-to-use case beyond the URL constraint, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_adom_revisionA

Revert the live ADOM DB to a past revision.

FortiManager has no dedicated revert-ADOM-revision call. The documented mechanism (How-To 013, "How to revert an ADOM Revision?") is to clone the target past revision: this both restores the live ADOM DB to that historical state and records the clone itself as a brand-new revision. This writes to the ADOM DB (a pure ADOM object, not a device) -- push any restored policy/object changes to devices separately with preview_install

  • install_package/install_device_settings as needed.

Safety: governed by FMG_REVERT_SAFETY (default "strict"), same pattern as trigger_fmg_restore -- refused unless confirm=True is also passed. A clone-revert has no dry-run or content-screening equivalent (unlike the firewall-policy revert, which is gated by content instead): it replaces the entire live ADOM DB in one call, so the gate is a plain explicit confirmation. Set FMG_REVERT_SAFETY=disabled to remove it.

Args: adom: ADOM name revision: Revision number to revert to (the version field from list_adom_revisions) name: Name for the newly-created revision (default: "Restored-rev_{revision}") desc: Description for the newly-created revision (default: "Revert of ADOM Revision #{revision}") locked: Protect the newly-created revision from deletion (default False) confirm: Must be True to proceed under FMG_REVERT_SAFETY=strict (default). Ignored when FMG_REVERT_SAFETY=disabled.

Returns: dict: status, adom, reverted_from, new_revision, message

NameRequiredDescriptionDefault
adomYes
descNo
nameNo
lockedNo
confirmNo
revisionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does: it discloses that this replaces the entire live ADOM DB in one irreversible call, that there is no dry-run or content screening (contrasted with the firewall-policy revert), that it writes only ADOM objects and not devices, and how to disable the safety gate via FMG_REVERT_SAFETY.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and mechanism, then safety, then args — a sensible order. It is on the long side and includes a Returns block that duplicates the existing output schema, plus a few restated defaults, but no sentence is misleading or filler-heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-blast-radius destructive operation with six parameters, zero schema descriptions, and no annotations, the description supplies mechanism, safety gate, follow-up workflow, and per-parameter meaning. Nothing an agent needs to invoke it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does for all six parameters: adom, revision (with provenance: the `version` field from list_adom_revisions), name/desc defaults, locked semantics, and confirm's behavior with its interaction with FMG_REVERT_SAFETY=disabled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a precise verb+resource+target: 'Revert the live ADOM DB to a past revision.' It also explains the underlying clone mechanism and distinguishes this from the firewall-policy revert, so an agent can tell it apart from revert_device_revision, revert_firewall_policy, and diff_adom_revision without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when this applies, how it works (clone-based revert, since FortiManager has no dedicated call), and routes the agent to list_adom_revisions for the revision value and to preview_install/install_package for pushing restored config to devices. The gating condition (confirm=True under FMG_REVERT_SAFETY=strict) is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_device_revisionA

Revert a device's device DB to a past revision.

This rewrites FortiManager's stored device DB copy for device only -- the live FortiGate is not touched. Push the reverted device DB to the device the same way any other device DB change is pushed: preview_install then install_device_settings.

Safety: governed by FMG_REVERT_SAFETY (default "strict"), same pattern as revert_adom_revision -- refused unless confirm=True is also passed. Set FMG_REVERT_SAFETY=disabled to remove it.

Note: Requires the device to have at least one device DB revision on record -- see the note on list_device_revisions. Not live-tested (reverting a device's config is a real, consequential write); the request shape matches the FNDN-documented, non-deprecated /deployment/revert command exactly (see client.py), which the sibling get/checkout calls confirm works correctly on this FMG generation for devices that have revision history.

Args: device: Managed device name revision: Revision number to revert to (see list_device_revisions) confirm: Must be True to proceed under FMG_REVERT_SAFETY=strict (default). Ignored when FMG_REVERT_SAFETY=disabled.

Returns: dict: status, device, revision, message

NameRequiredDescriptionDefault
deviceYes
confirmNo
revisionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses the FMG_REVERT_SAFETY='strict' gate, that confirm=True is mandatory unless the env var is disabled, the exact blast radius (stored device DB only, not the device), and the honest caveat that it is not live-tested but mirrors the documented /deployment/revert request shape. This is exactly the context annotations would otherwise provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and safety of scope, then usage, then args. A few passages (the client.py reference, the not-live-tested aside) are slightly verbose, but each still conveys risk information an agent would want before a consequential write.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A consequential mutation tool with no annotations and a 0%-coverage schema is fully covered: what it mutates, what it does not, how to propagate the change, the safety gate, the prerequisite revision history, and the return shape. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet all three parameters are explained with meaning beyond their types: device is the managed device name, revision points the agent to list_device_revisions for valid values, and confirm's interaction with FMG_REVERT_SAFETY (mandatory when strict, ignored when disabled) is spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Revert a device's device DB to a past revision') and immediately scopes it: only FortiManager's stored copy is rewritten, the live FortiGate is untouched. This clearly distinguishes it from sibling revert_adom_revision, which it names by analogy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent what to do after reverting (preview_install then install_device_settings), states the prerequisite that the device must have revision history (pointing at list_device_revisions), and states that confirm=True is required under the default safety mode. When-to-use and prerequisites are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_firewall_policyA

Restore a firewall policy to a past change-log snapshot.

FortiManager has no dedicated revert-firewall-policy endpoint. The documented mechanism (How-To 008, "How to revert a firewall policy from a past changes?") is to capture a past change's config snapshot from list_policy_revisions and update the live policy with it -- this tool does exactly that. This writes a policy OBJECT inside the ADOM's policy package; it does not touch any device. Push the reverted policy to devices the same way any other policy edit is pushed: preview_install then install_package.

Args: adom: ADOM name package: Policy package name config: A snapshot from list_policy_revisions' "config" field -- either the JSON string as returned, or the already-decoded dict. Must include "policyid". Any "oid" key is stripped automatically (FortiManager rejects the write if it is present). revision_note: Optional note recorded against this change

Returns: dict: status, adom, package, policyid, message

Example: >>> revisions = await list_policy_revisions("demo", "ppkg_001", policyid=14) >>> await revert_firewall_policy( ... "demo", "ppkg_001", revisions["changes"][0]["config"], ... revision_note="Revert from create time", ... )

NameRequiredDescriptionDefault
adomYes
configYes
packageYes
revision_noteNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and does it well: it discloses that a policy object is written inside the ADOM package and that no device is touched, notes the oid-stripping behavior and that policyid is required, and spells out the return dict keys. These are specific side-effect and gotcha disclosures that the schema does not capture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the core purpose, then uses clean Args/Returns/Example sections. It is on the longer side, but the mechanism explanation and example both earn their place given the non-obvious underlying endpoint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and 0% schema coverage, the description is complete: it covers what is written, what is not touched, required inputs, the oid caveat, the push follow-up, and it even lists return keys despite an output schema existing. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: adom and package as names, config explained as either a JSON string or decoded dict that must include policyid and have oid stripped, and revision_note as an optional recorded note. All four parameters get meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Restore a firewall policy to a past change-log snapshot') and immediately distinguishes the mechanism from a normal update, noting there is no dedicated revert endpoint. An agent can tell this apart from update_firewall_policy without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the context clearly: use list_policy_revisions to capture a config snapshot, then this tool, then preview_install/install_package to push. It does not explicitly state when NOT to use this tool or name the specific sibling alternative, but the workflow routing is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_devicesA

Search for devices with filters.

Args: adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") name_filter: Filter by device name (partial match) platform_filter: Filter by platform type (e.g., "FortiGate-VM") os_version_filter: Filter by OS version as major[.minor[.patch]] (e.g., "7", "7.4" or "7.4.12"; a leading "v" is accepted) connection_status: Filter by status ("up" or "down")

Returns: dict: Search results with keys: - status: "success" or "error" - count: Number of matching devices - devices: List of matching device objects - message: Error message if failed

Example: >>> # Find all FortiGate VMs >>> result = await search_devices(platform_filter="FortiGate-VM")

>>> # Find offline devices
>>> result = await search_devices(connection_status="down")

>>> # Find devices by name pattern
>>> result = await search_devices(name_filter="Branch")
NameRequiredDescriptionDefault
adomNo
name_filterNo
platform_filterNo
connection_statusNo
os_version_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description provides useful return structure and error behavior, but does not state read-only status, permission requirements, pagination, or result limits. It gives adequate but incomplete behavioral context for a search operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with Args, Returns, and Example sections and is front-loaded with purpose. The examples and return details are useful, though slightly more verbose than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five optional parameters, no annotations, and an output schema, the description is nearly complete: it documents all inputs, defaults, return keys, and examples. It could more fully describe when to choose this tool over sibling device-listing tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden. It defines every parameter, including the ADOM default behavior, partial-match semantics for name_filter, platform examples, accepted OS version formats, and allowed connection_status values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches devices with filters, providing a specific verb and resource. It does not explicitly distinguish itself from the sibling list_devices tool, so the purpose is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through filter examples such as finding FortiGate VMs or offline devices, but there is no explicit guidance on when to use this tool versus list_devices or other sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_firewall_policiesA

Search firewall policies with filters.

Args: adom: ADOM name package: Policy package name name_filter: Filter by policy name (partial match) srcaddr_filter: Filter by source address (partial match) dstaddr_filter: Filter by destination address (partial match) service_filter: Filter by service (partial match) action_filter: Filter by action ("accept" or "deny") status_filter: Filter by status ("enable" or "disable")

Returns: dict: Search results with keys: - status: "success" or "error" - count: Number of matching policies - policies: List of matching policy objects - message: Error message if failed

Example: >>> # Find all deny policies >>> result = await search_firewall_policies( ... adom="root", ... package="default", ... action_filter="deny" ... )

>>> # Find policies using a specific address
>>> result = await search_firewall_policies(
...     adom="root",
...     package="default",
...     srcaddr_filter="Server-Subnet"
... )
NameRequiredDescriptionDefault
adomYes
packageYes
name_filterNo
action_filterNo
status_filterNo
dstaddr_filterNo
service_filterNo
srcaddr_filterNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries full burden. It discloses that filters perform partial matches, describes the return format (dict with status, count, policies, message), and includes examples. It does not mention side effects (likely none as it's read-only) or rate limits, but is fairly transparent for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a purpose statement, Args list, Returns, and Examples. It is front-loaded and clear, though slightly lengthy. Every sentence adds value, and the structure aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (8 parameters, 2 required) and the presence of an output schema (not shown), the description adequately covers parameter semantics and return format. It does not mention error handling beyond a message field or rate limits, but is sufficient for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate. It lists all 8 parameters with clear explanations (e.g., 'Filter by policy name (partial match)'), adding significant meaning beyond the schema which only provides names and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search firewall policies with filters.' It uses a specific verb (search) and resource (firewall policies), and distinguishes from sibling tools like list_firewall_policies (which lists all) and get_firewall_policy (which gets a specific one).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool (when filtering is needed) via examples, but does not explicitly state when not to use it or mention alternatives. The examples are helpful but lack explicit exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_objectsA

Search across all firewall objects by name.

Searches addresses, address groups, services, and service groups for objects matching the search term.

Args: adom: ADOM name search_term: Search term (partial match)

Returns: dict: Search results with keys: - status: "success" or "error" - addresses: Matching address objects - address_groups: Matching address groups - services: Matching service objects - service_groups: Matching service groups - total_count: Total matches - message: Error message if failed

Example: >>> result = await search_objects("root", "web")

NameRequiredDescriptionDefault
adomYes
search_termYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes the return format in detail (status, lists of matches, total count, message) and notes partial matching. It does not mention side effects or error handling but is otherwise transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (Args, Returns, Example) and front-loads the main purpose. It is slightly verbose due to the detailed Returns dict, but every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (searches multiple object types) and the presence of an output schema, the description fully explains the output format and includes an example. It covers all necessary aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description's Args section adds meaning: 'ADOM name' and 'Search term (partial match)'. This is sufficient, though more detail could be added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches across all firewall objects by name, listing specific object types (addresses, address groups, services, service groups). This distinguishes it from sibling search tools like search_devices and search_firewall_policies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (searching firewall objects by name). However, it does not explicitly mention when not to use it or compare it to alternative search tools among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_packet_captureB

Start a packet capture from an existing definition.

Args: capture_id: ID of an existing packet capture definition (see list_packet_captures() or add_packet_capture())

Returns: dict: Start result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await start_packet_capture(1)

NameRequiredDescriptionDefault
capture_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It says nothing about what starting a capture actually does — that it runs until explicitly stopped, that it consumes device resources, what permissions or device connectivity are required, or whether concurrent captures are allowed. For a non-trivial operational action 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core sentence is front-loaded and useful, but the block is padded with a docstring-style Args section and a Returns section that largely restate the input schema and output schema. The toy doctest example ('result = await start_packet_capture(1)') adds no information beyond the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the Returns block is redundant rather than necessary, and the single parameter is covered. What's missing is lifecycle context for a stateful operation: the description never implies the capture keeps running after return or that stop_packet_capture must eventually be called, which is the one thing an agent most needs to know here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: capture_id is defined as the ID of an existing packet capture definition, with the two functions that produce such an ID named explicitly. It doesn't state whether IDs are per-ADOM or per-device, which leaves a small ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Start a packet capture') and qualifies it as operating on an existing definition, which distinguishes it from the sibling add_packet_capture that creates a definition. It stops short of naming stop_packet_capture or get_packet_capture_status explicitly, so sibling separation is implied rather than spelled out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear prerequisite and routing hint: the capture_id must come from list_packet_captures() or add_packet_capture(). However, it never states when NOT to use it (e.g., an already-running capture, or a device that doesn't support capture) and doesn't point to the stop/status siblings, so the agent must infer the surrounding workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_packet_captureB

Stop a running packet capture.

Args: capture_id: ID of an existing packet capture definition

Returns: dict: Stop result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await stop_packet_capture(1)

NameRequiredDescriptionDefault
capture_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the precondition that the capture must be running and that capture_id must reference an existing definition, and it describes the success/error result shape, but it says nothing about side effects, irreversibility, permission requirements, or failure behavior when the capture is already stopped.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one clear sentence and the Args/Example blocks are compact. The Returns block is largely redundant because an output schema already exists, but it does not bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter state-change tool with an output schema, the description covers purpose, the one parameter's meaning, and outcome shape. The remaining gap is failure-mode behavior when no capture is running.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the only parameter is a bare integer, but the description clarifies it is the 'ID of an existing packet capture definition', which tells the agent this is the definition ID rather than a runtime session handle.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Stop a running packet capture." The verb 'stop' cleanly separates it from the sibling verbs start_packet_capture, get_packet_capture_status, and list_packet_captures, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'running packet capture' hints at a precondition but there is no explicit when-to-use guidance, no mention of checking status first via get_packet_capture_status, and no statement about what to do if the capture is not running.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_fmg_backupA

Trigger a FortiManager system backup to a remote server.

Starts an asynchronous backup of the FortiManager's own configuration to an external FTP/SCP/SFTP/TFTP server. This is a FortiManager-itself operation -- it does not touch any managed device. Use wait_for_task() or get_task() (system_tools.py) to monitor completion; once done, the backup file is on the remote server at the given filename.

Args: service: Transfer protocol - "ftp", "scp", "sftp", or "tftp" server: Remote server hostname or IP address filename: Destination path and file name on the remote server (e.g. "tmp/fmg_backup.dat") username: Login username for the remote server (required for ftp/ scp/sftp; optional) userpasswd: Login password for the remote server (optional) port: Remote server port (optional; protocol default used if unset) passwd: Password to encrypt the backup file with (optional; FMG 7.0.11+/7.2.5+/7.4.2+ no longer allow an unencrypted backup)

Returns: dict: Backup result with keys: - status: "success" or "error" - task_id: Task ID for monitoring (if returned) - message: Status or error message

Example: >>> result = await trigger_fmg_backup( ... service="ftp", ... server="10.210.35.207", ... filename="tmp/fmg_backup.dat", ... username="tiger", ... userpasswd="fortinet", ... passwd="fortinet", ... ) >>> if result["status"] == "success": ... await wait_for_task(result["task_id"])

NameRequiredDescriptionDefault
portNo
passwdNo
serverYes
serviceYes
filenameYes
usernameNo
userpasswdNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that the operation is asynchronous, where the artifact lands ('the backup file is on the remote server at the given filename'), and that newer FMG versions reject unencrypted backups. It omits permission requirements, whether an existing remote file is overwritten, and any timeout/size expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: the one-line summary, the scope note, and the monitoring pointer come before the Args block. The structure is easy to scan, though the Returns section partially restates the output schema and the worked example lengthens an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers everything needed to invoke correctly: async nature, monitoring handoff to wait_for_task/get_task, per-parameter meaning, the encryption constraint, and the destination of the resulting artifact. The output schema handles the return shape, so no further detail is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it does — all seven parameters are explained, including the enum of valid 'service' values, optionality of username/userpasswd/port, a path format example for filename, and the version-dependent requirement that passwd be set. This adds substantial meaning beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Trigger a FortiManager system backup to a remote server') and immediately scopes it: this backs up the FortiManager's own configuration, not a managed device. That distinction cleanly separates it from the many device-oriented siblings in the tool list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the follow-up path ('Use wait_for_task() or get_task() (system_tools.py) to monitor completion') and explicitly excludes the case where a managed device is involved. An agent knows both what to do next and when this is the wrong tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trigger_fmg_restoreA

Restore the FortiManager system from a backup on a remote server.

Restores the FortiManager's own configuration from a backup file previously uploaded to an external FTP/SCP/SFTP/TFTP server (see trigger_fmg_backup). This is a disruptive, FortiManager-itself operation -- it does not touch any managed device, but it does REPLACE FMG's ENTIRE configuration and will interrupt the FMG service.

Safety: governed by FMG_RESTORE_SAFETY (default "strict"). Under strict, this call is refused unless confirm=True is also passed -- unlike install_package (gated by a verified preview) or firewall policy writes (gated by content screening), there is no dry-run or content check possible for a restore, so the gate is a plain explicit confirmation instead. Set FMG_RESTORE_SAFETY=disabled to remove the gate entirely.

Args: service: Transfer protocol - "ftp", "scp", "sftp", or "tftp" server: Remote server hostname or IP address filename: Path and file name of the backup on the remote server username: Login username for the remote server (optional) userpasswd: Login password for the remote server (optional) port: Remote server port (optional; protocol default used if unset) passwd: Password to decrypt the backup file, if it was encrypted (optional) confirm: Must be True to proceed under FMG_RESTORE_SAFETY=strict (default). Ignored when FMG_RESTORE_SAFETY=disabled.

Returns: dict: Restore result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await trigger_fmg_restore( ... service="ftp", ... server="10.210.35.207", ... filename="tmp/fmg_backup.dat", ... username="tiger", ... userpasswd="fortinet", ... confirm=True, ... )

NameRequiredDescriptionDefault
portNo
passwdNo
serverYes
confirmNo
serviceYes
filenameYes
usernameNo
userpasswdNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses that this REPLACES FMG's entire configuration, interrupts the FMG service, and is gated by the FMG_RESTORE_SAFETY environment variable with strict-by-default behavior. It does not mention expected downtime, duration, or whether an automatic pre-restore config snapshot exists, which are the remaining behavioral facts an agent would want before invoking an irreversible operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then destructive impact, then the safety gate, then per-parameter detail — a sensible ordering. The Args block is long but earns its place given zero schema coverage; the Returns block is somewhat redundant with the output schema, and the example is optional padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, destructive, environment-gated operation with no annotations, the description supplies purpose, blast radius, gating semantics, all parameter meanings, and a usage example. The output schema already covers return shape, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: every one of the 8 parameters is documented with meaning beyond its title, including the enumerated protocol values for service, the path semantics of filename, the protocol-default behavior of port, and critically the distinction between userpasswd (remote login) and passwd (backup decryption password) — a distinction the schema alone cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Restore') and a specific resource (FortiManager's own configuration from a remote backup file), and explicitly delimits scope: it does not touch managed devices, unlike other device-oriented siblings. It also cross-references trigger_fmg_backup as the counterpart operation, so an agent can tell the two apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit preconditions (backup previously uploaded to FTP/SCP/SFTP/TFTP, see trigger_fmg_backup) and explicitly contrasts its safety model with named alternatives (install_package uses a verified preview, firewall policy writes use content screening) to explain why this one needs a plain confirm flag. The when/when-not logic is fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unassign_sdwan_templateB

Unassign an SD-WAN template from a device.

Args: adom: ADOM name template: SD-WAN template name device: Device name to unassign vdom: VDOM name (default: root)

Returns: Unassignment result

NameRequiredDescriptionDefault
adomYes
vdomNoroot
deviceYes
templateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and description lacks details on side effects, reversibility, or required permissions. Only states the basic action without behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise with one introductory sentence and structured Args/Returns. No wasted words, though Returns section is minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple mutation tool with 4 parameters. Lacks behavioral and usage guidance, and output schema not explained despite its existence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the Args section adds meaning: 'ADOM name', 'SD-WAN template name', etc. Provides default for vdom. Could be improved with format or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action 'Unassign an SD-WAN template from a device.' It uses a specific verb and resource, and distinguishes from sibling tools like assign_sdwan_template.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., unassign_system_template). No prerequisites or context provided beyond the basic action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unassign_system_templateA

Unassign a system template from a device.

Args: adom: ADOM name template: System template name device: Device name to unassign vdom: VDOM name (default: root)

Returns: Unassignment result

NameRequiredDescriptionDefault
adomYes
vdomNoroot
deviceYes
templateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behaviors. It only states the action and returns 'Unassignment result' without mentioning permissions, reversibility, or potential side effects. This is minimal and insufficient for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear structure: one-line summary, Args list, Returns. No redundant information; every sentence is relevant and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, return value details are not needed. However, the description lacks context about prerequisites (e.g., template must be assigned), error handling, or typical usage scenarios. It is adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the description adds meaning by labeling each parameter (e.g., 'ADOM name', 'Device name') and noting the default for vdom. This clarifies purpose beyond bare property names, though it lacks constraints or formatting details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with a specific verb ('Unassign') and resource ('system template' from a device). It directly distinguishes from sibling tools like assign_system_template.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives (e.g., assign_system_template, assign_system_template_bulk). No context on prerequisites or expected scenarios is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unlock_adomA

Unlock an ADOM (workspace mode).

Release the lock on an ADOM. Changes should be committed before unlocking to persist them.

Args: adom: ADOM name to unlock

Returns: dict: Unlock result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states the tool releases a lock, which implies mutation. With no annotations, it carries the burden of transparency. It does not mention authentication requirements, rate limits, or what happens if the ADOM is already unlocked, leaving some behavioral details unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences plus structured Args and Returns sections. It is front-loaded with the main purpose. Could be slightly more compact, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter, the description covers the action, a prerequisite (commit), and the return format. It is reasonably complete given the tool's simplicity and the presence of an output schema description. Minor omissions like checking lock status don't severely impact completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'adom' has no schema description (0% coverage). The description adds meaning: 'ADOM name to unlock', which clarifies what the parameter refers to beyond just the type and title. This compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'unlock' and the resource 'ADOM (workspace mode)', making the tool's purpose immediately clear. It is distinct from siblings like 'lock_adom' and 'commit_adom'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear usage instruction: 'Changes should be committed before unlocking to persist them.' This tells the agent when to use the tool (after committing). However, it does not explicitly list alternatives or when not to use it, missing some guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_addressA

Update an existing address object.

Only specified fields will be updated.

Args: adom: ADOM name name: Current address name new_name: New name (optional) subnet: New subnet for ipmask type (optional) fqdn: New FQDN for fqdn type (optional) comment: New comment (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
fqdnNo
nameYes
subnetNo
commentNo
new_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It explains that only specified fields are updated and lists return values. However, it does not disclose side effects, idempotency, or error conditions (e.g., address not found).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief with a clear summary, then structured Args and Returns sections. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters and no annotations, the description covers the core behavior and return structure. It lacks error handling details but is sufficient for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description compensates with an Args section detailing each parameter's role (e.g., 'name: Current address name'). This adds meaning beyond the schema's types, though format details for subnet or fqdn could improve clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update an existing address object.' and specifies that only provided fields will be modified. It distinguishes from siblings like create, delete, get, list, and update_address_group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for modifying an existing address but does not explicitly state when to use it versus alternatives, nor does it mention prerequisites like the address must exist. It lacks when-not guidance.

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.

Args: adom: ADOM name name: Group name members: New member list (replaces existing) comment: New comment

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
membersNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals that 'members' replaces the existing list and the return format includes status/message. However, it does not clarify if other fields are additive or replaced, nor does it mention side effects or validation behavior. With no annotations, more detail is expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear Args/Returns structure. Every sentence adds information, though the formatting could be tighter. It is front-loaded with the action and fits in a few lines.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with four parameters and an output schema. The description covers action, parameters, and return value but omits whether updates are partial or full replacement (except for members). Prerequisites and error conditions are not discussed, leaving some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds value for 'members' (replaces existing) and 'comment' (new comment), but 'adom' and 'name' are just restated. The descriptions are minimal but partially informative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update an address group.' with input parameters that match the resource. Siblings include create, delete, get, and list for address groups, making the purpose distinct and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like create_address_group or delete_address_group. It lacks context on prerequisites (e.g., group must exist) or conditions for updates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_antivirus_profileA

Update an existing antivirus profile.

Only specified fields will be updated.

Args: adom: ADOM name name: Profile name comment: New comment (optional) feature_set: New flow/proxy feature set - "proxy" or "flow" (optional) scan_mode: New scan mode - "default" or "legacy" (optional) av_virus_log: New AntiVirus logging setting - "enable" or "disable" (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
scan_modeNo
feature_setNo
av_virus_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose two useful behaviors: partial updates ('Only specified fields will be updated') and the return shape. It omits important lifecycle facts for FortiManager, notably that changes likely require commit_adom to take effect, and says nothing about permissions or lock requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and the partial-update rule in the first two lines, then a compact parameter list with no filler. The Returns block is slightly redundant given an output schema exists, but it is short and does not bloat the definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation with no annotations, the definition covers operation, partial-update semantics, all parameter meanings and allowed values, and the response shape. The main missing piece is the commit/lock workflow context that governs whether the update actually takes effect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: each of the six parameters gets a one-line meaning, and crucially the allowed values for feature_set (proxy/flow), scan_mode (default/legacy) and av_virus_log (enable/disable) are stated even though the schema has no enums. The adom/name params get only a bare restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Update an existing antivirus profile." The word "existing" implicitly separates it from create_antivirus_profile, but the description never names the sibling tools it must be distinguished from.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'update existing' framing and by 'Only specified fields will be updated,' which signals a partial/patch-style update. There is no explicit when-to-use guidance, no prerequisite statements (e.g., profile must exist, ADOM must be locked), and no routing to alternatives like create_antivirus_profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_application_listA

Update an existing application-control list.

Only specified fields will be updated.

Args: adom: ADOM name name: List name comment: New comment (optional) deep_app_inspection: New deep-inspection setting - "enable" or "disable" (optional) unknown_application_action: New unknown-application action - "pass" or "block" (optional) other_application_action: New other-application action - "pass" or "block" (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
deep_app_inspectionNo
other_application_actionNo
unknown_application_actionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It does disclose the merge/partial-update behavior and the return shape (status/message), which is helpful. But it omits permissions, locking requirements, validation failures, or side effects on policies referencing the list — meaningful gaps for a mutation 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead statement and the partial-update note are front-loaded and the Args list earns its place given 0% schema coverage. The Returns block duplicates the existing output schema and could be dropped, which is the main source of waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so omitting return detail would be acceptable — and the parameter set is fully explained. Yet for a 6-param mutation tool with no annotations, the description should say something about required permissions, ADOM scoping, or the effect of changing action fields; those are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and there are no enums, so the Args section is the only source of parameter meaning — and it delivers, documenting each field's purpose plus the allowed values ('enable'/'disable', 'pass'/'block'). Only 'adom' and 'name' are left as bare labels, which is a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Update an existing application-control list.' This clearly distinguishes it from create_/delete_/get_/list_application_list siblings by the standard naming convention, though it does not explicitly name an alternative or boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Only specified fields will be updated' conveys partial-update semantics, implying this is the tool for modifying a subset of settings. However, there is no explicit guidance on when to prefer this over recreation, nor any stated prerequisites such as the list needing to exist or the ADOM being locked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_deviceA

Update device properties.

Modify device metadata like description and location.

Args: adom: ADOM name device: Device name description: New device description latitude: GPS latitude for device location longitude: GPS longitude for device location

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

Example: >>> result = await update_device( ... adom="root", ... device="FGT-HQ", ... description="Main headquarters firewall", ... latitude=37.7749, ... longitude=-122.4194 ... )

NameRequiredDescriptionDefault
adomYes
deviceYes
latitudeNo
longitudeNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description indicates that this tool modifies device metadata but does not clarify whether updates are partial (only provided fields) or full replacements. It also omits any discussion of side effects, permissions, or idempotency. With no annotations, the description carries full burden but only meets a basic level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with a one-line summary, separate sections for Args, Returns, and an Example. Every part adds value, and the example illustrates typical usage without excess.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update tool with an output schema described, the description covers purpose, all parameters, return structure, and usage example. Missing are error conditions, partial vs full update behavior, and prerequisites (e.g., device existence). Still, it is quite complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides meaningful explanations for all five parameters in the Args block (e.g., 'adom: ADOM name', 'device: Device name', 'description: New device description', 'latitude: GPS latitude for device location', 'longitude: GPS longitude for device location'), fully compensating for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update device properties' and elaborates with 'Modify device metadata like description and location.' This specific verb+resource combination distinguishes it from siblings such as add_device, delete_device, and get_device.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like update_address or other update tools. There is no mention of prerequisites, conditions, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_dhcp_serverA

Update a device-DB DHCP server scope by id. Only provided fields change.

The lease range is replaced as a whole, so start_ip and end_ip must be given together.

Args: device: Managed device name dhcp_server_id: Numeric scope id (see list_device_dhcp_servers) start_ip: New first address of the lease range end_ip: New last address of the lease range netmask: New scope netmask default_gateway: New gateway handed to clients dns_servers: Up to three DNS servers; replaces the served set lease_time: New lease time in seconds vdom: VDOM the scope lives in (default "root")

Returns: Update result

NameRequiredDescriptionDefault
vdomNoroot
deviceYes
end_ipNo
netmaskNo
start_ipNo
lease_timeNo
dns_serversNo
dhcp_server_idYes
default_gatewayNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses partial-update semantics, the coupled start_ip/end_ip replacement rule, and that dns_servers replaces the served set entirely (capped at three). It does not cover permission requirements or whether a commit/install step is needed for changes to take effect, which matters for this mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The mutation contract and the atomic lease-range rule are front-loaded in the first two sentences, followed by a scannable Args list where every line adds distinct information. No redundant restatement of the tool name or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the brief 'Returns: Update result' is sufficient and no return documentation is owed. Parameter and mutation semantics are well covered; the only gaps are operational context such as permission/commit requirements and behavior when the id is invalid.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the Args block is the only source of parameter meaning, and it documents all nine parameters with real semantics: dhcp_server_id as a numeric scope id, vdom defaulting to root, dns_servers capped at three and replacing the existing set, lease_time in seconds. This is substantially more than the bare titles in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb (Update), resource (device-DB DHCP server scope), and addressing key (by id), which distinguishes it from create/delete siblings by verb alone. It also points to list_device_dhcp_servers for id discovery, though it does not explicitly contrast against create_device_dhcp_server.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the partial-update contract ('Only provided fields change') and a key precondition: the lease range is atomic, so start_ip and end_ip must be supplied together. It also routes the agent to list_device_dhcp_servers to obtain dhcp_server_id. No explicit when-not guidance or alternative tool is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_interfaceA

Update fields on a device-DB interface. Only provided fields change.

Args: device: Managed device name name: Interface name to update ip: New address, CIDR or "address netmask" form allowaccess: Replacement administrative-access list role: Interface role: lan, wan, dmz or undefined alias: Short alias shown in the GUI description: Interface description vlanid: New VLAN id (1-4094)

Returns: Update result

NameRequiredDescriptionDefault
ipNo
nameYes
roleNo
aliasNo
deviceYes
vlanidNo
allowaccessNo
descriptionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses partial-update semantics (only provided fields change) and that it returns an update result, but omits permissions, whether a commit is required, lock/prerequisite behavior, and what happens on invalid values or failed writes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The leading sentence states the action and the key mutation semantics, followed by a structured Args list and return note. There is no filler, and the agent can parse it quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers every parameter and important partial-update behavior, and an output schema exists so return details need not be expanded. It is only slightly incomplete for a no-annotation mutation tool because it does not address prerequisites, commit or locking requirements, or failure behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all eight parameters are explained with added meaning beyond the schema. It gives IP address forms, a VLAN range, allowed role values, replacement semantics for allowaccess, and clarifies device and name as identifiers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: updates fields on a device-DB interface. The partial-update note distinguishes it from create_device_interface and delete_device_interface, but it does not explicitly name siblings or clarify boundaries against update_device or update_device_ipsec_phase1_interface.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is for updating an existing interface and that only supplied fields change, which is useful context. However, it does not explicitly say when to use this instead of create_device_interface, get_device_interface_config, or other update tools, nor does it state prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_ipsec_phase1_interfaceA

Update fields on a device-DB IPsec phase1-interface. Only provided fields change.

Args: device: Managed device name name: Phase1-interface (remote gateway) name to update interface: New local outgoing interface type: New remote gateway type: "static", "dynamic" or "ddns" remote_gw: New remote gateway IPv4 address psksecret: New pre-shared key, 6-128 characters ike_version: New IKE protocol version, "1" or "2" mode: New IKEv1 ID protection mode: "main" or "aggressive" peertype: New peer ID acceptance mode proposal: Replacement phase1 proposal list dhgrp: Replacement phase1 DH group list nattraversal: New NAT traversal setting dpd: New Dead Peer Detection mode keylife: New phase1 key life in seconds comments: New free-text comment vdom: VDOM the gateway lives in (default "root")

Returns: Update result with any echoed credential stripped

NameRequiredDescriptionDefault
dpdNo
modeNo
nameYes
typeNo
vdomNoroot
dhgrpNo
deviceYes
keylifeNo
commentsNo
peertypeNo
proposalNo
interfaceNo
psksecretNo
remote_gwNo
ike_versionNo
nattraversalNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavior itself. It usefully states that only provided fields change and that echoed credentials are stripped from the result. It does not disclose permission requirements, whether a commit or lock is needed, error behavior when the object is missing, or the impact of changing sensitive fields such as psksecret.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and then uses a structured Args list appropriate for 16 undocumented parameters. Most lines earn their place by documenting a field; the Returns line overlaps the output schema but adds the useful credential-stripping detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the required device/name parameters and most optional fields, and the output schema handles return structure. However, for a complex mutation with no annotations and 0% schema coverage, it omits important invocation context such as when to use it versus siblings and allowed values for several string parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden and does so well: it names all 16 parameters and gives meanings, including allowed values for type, ike_version, and mode, plus the 6-128 character constraint for psksecret. Some gaps remain for peertype, dpd, nattraversal, proposal, and dhgrp, whose accepted values or formats are not specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: update fields on a device-DB IPsec phase1-interface. This clearly distinguishes it from sibling create/get/list/delete tools for the same resource. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Only provided fields change' clarifies partial-update semantics, which is useful. However, the description does not explicitly say when to use this versus create/get/delete, nor does it state prerequisites such as ensuring the gateway exists or any required ADOM/device lock context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_ipsec_phase2_interfaceA

Update fields on a device-DB IPsec phase2-interface. Only provided fields change.

Args: device: Managed device name name: Phase2-interface (tunnel) name to update phase1name: New parent phase1-interface name src_subnet: New local proxy ID subnet, CIDR or "address netmask" form dst_subnet: New remote proxy ID subnet, same accepted forms proposal: Replacement phase2 proposal list dhgrp: Replacement phase2 DH group list pfs: New Perfect Forward Secrecy setting replay: New replay detection setting keepalive: New keep-alive setting auto_negotiate: New IPsec SA auto-negotiation setting keylifeseconds: New phase2 key life in seconds (120-172800) comments: New free-text comment vdom: VDOM the tunnel lives in (default "root")

Returns: Update result

NameRequiredDescriptionDefault
pfsNo
nameYes
vdomNoroot
dhgrpNo
deviceYes
replayNo
commentsNo
proposalNo
keepaliveNo
dst_subnetNo
phase1nameNo
src_subnetNo
auto_negotiateNo
keylifesecondsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the partial-update trait and the keylifeseconds valid range (120-172800), but for a mutation tool it omits whether changes take effect on the managed device immediately or only after a package install, whether the object must pre-exist, permission/lock requirements, and whether the update is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key statement is front-loaded in the first two sentences and the per-argument list is proportionate to a 14-parameter tool. Some argument lines restate schema titles with little added meaning (e.g., 'comments: New free-text comment'), a minor redundancy rather than bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the thin 'Returns: Update result' is acceptable. However, for a 14-parameter mutation tool with zero annotation coverage, the description leaves out the operational context an agent needs (whether a subsequent commit/install is required, existence precondition, valid values for the boolean-like settings).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: every one of the 14 parameters gets a gloss, plus real added semantics such as accepted subnet forms (CIDR or 'address netmask'), the keylifeseconds range, and the vdom default of 'root'. It falls short of 5 because enum-like string parameters (pfs, replay, keepalive, auto_negotiate) only say 'New ... setting' without indicating accepted values such as enable/disable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update fields on a device-DB IPsec phase2-interface') and immediately clarifies the partial-update semantics with 'Only provided fields change.' The verb/resource combination cleanly separates it from the create/get/list/delete phase2-interface siblings in the same family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: it is an update of an existing tunnel, and 'Only provided fields change' hints at partial-update usage, but there is no explicit guidance on when to use this versus create_device_ipsec_phase2_interface or get_..., no prerequisites (object must exist, ADOM/workspace lock, install needed to push to device), and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_sslvpn_settingsA

Update the SSL-VPN (Agentless VPN) settings object in a device's device DB.

Only provided fields change -- see get_device_sslvpn_settings for the current state to base a partial update on.

Args: device: Managed device name status: Enable/disable SSL-VPN: "disable" or "enable" port: SSL-VPN access port (1-65535) source_interface: Source interface names of incoming traffic default_portal: Default web portal name (see update_device_sslvpn_web_portal) servercert: Server certificate name to present to clients idle_timeout: Idle timeout in seconds before disconnect auth_timeout: Authentication timeout in seconds (1-259200, 0 = no timeout) dns_server1: Primary DNS server handed to clients dns_server2: Secondary DNS server handed to clients reqclientcert: Require client certificates: "disable" or "enable" https_redirect: Redirect port 80 to the SSL-VPN port: "disable" or "enable" ssl_min_proto_ver: Minimum TLS version: "tls1-0", "tls1-1", "tls1-2" or "tls1-3" vdom: VDOM the settings apply to (default "root")

Returns: Update result

NameRequiredDescriptionDefault
portNo
vdomNoroot
deviceYes
statusNo
servercertNo
dns_server1No
dns_server2No
auth_timeoutNo
idle_timeoutNo
reqclientcertNo
default_portalNo
https_redirectNo
source_interfaceNo
ssl_min_proto_verNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that only provided fields change, documents allowed values and ranges, and notes the default VDOM, but it does not mention permissions, whether changes take effect immediately, commit requirements, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and partial-update rule, followed by a necessary parameter list for a 14-parameter tool. The only minor waste is the redundant "Returns: Update result" line, since an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with no annotations, the description covers the parameters, partial-update semantics, and related objects well enough for correct invocation. It is slightly incomplete on operational preconditions such as whether referenced certificates or portals must already exist and whether a commit/install step is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully, and it does: every parameter is documented with meaning, allowed values, ranges, defaults, or related-tool references. This is substantially more informative than the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: updating the SSL-VPN settings object in a device's device DB. It distinguishes itself from sibling tools by referencing get_device_sslvpn_settings for current state and update_device_sslvpn_web_portal for the related portal object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly explains the partial-update behavior and directs the agent to get_device_sslvpn_settings before updating. It does not explicitly state when to use this versus update_device_sslvpn_web_portal, but the cross-reference for default_portal provides useful routing context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_sslvpn_web_portalA

Update an SSL-VPN web portal in a device's device DB.

The portal itself must already exist in the device DB (created via the FortiOS CLI/GUI or a prior install) -- this tool only updates an existing entry, matching the "get/update" scope of this module. Only provided fields change.

Args: device: Managed device name name: Web portal name to update tunnel_mode: Enable/disable full-tunnel mode: "disable" or "enable" split_tunneling: Enable/disable split tunneling: "disable" or "enable" ip_pools: Firewall address/address-group names to draw tunnel-mode client IPs from web_mode: Enable/disable web-mode (clientless HTML5) access: "disable" or "enable" dns_server1: Primary DNS server handed to portal clients dns_server2: Secondary DNS server handed to portal clients vdom: VDOM the portal lives in (default "root")

Returns: Update result

NameRequiredDescriptionDefault
nameYes
vdomNoroot
deviceYes
ip_poolsNo
web_modeNo
dns_server1No
dns_server2No
tunnel_modeNo
split_tunnelingNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden, and it does disclose real behavior: the target object must pre-exist, and only supplied fields are modified (partial-update semantics), plus the vdom default of 'root'. Gaps remain for a mutation tool — nothing about ADOM lock requirements (lock_adom/unlock_adom exist in the toolset) or whether the change is staged in the ADOM and needs a commit/install to reach the device.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the pre-existence constraint and partial-update rule before the Args list, which is the right ordering. The parameter block is justified by the empty schema descriptions, though the 'Returns: Update result' line is near-wasted space given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with no annotations, the description covers preconditions, partial-update behavior and every argument, and the output schema relieves it of explaining return values. The one material omission is lifecycle: an agent cannot tell from this whether the update takes effect on the device immediately or requires a subsequent install/commit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with 9 parameters, so the Args block is doing essential work: it supplies the accepted values 'disable'/'enable' for tunnel_mode, split_tunneling and web_mode where the schema declares only an unrestricted string, explains that ip_pools takes firewall address/address-group names, and documents the vdom default. This adds meaning well beyond the bare JSON schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and a highly specific resource ('Update an SSL-VPN web portal in a device's device DB'), which separates it from the sibling update_device_sslvpn_settings (global settings) and from get_device_sslvpn_web_portal. The opening sentence alone lets an agent pick correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('The portal itself must already exist in the device DB... this tool only updates an existing entry') and an implicit when-not (creation must happen via FortiOS CLI/GUI or a prior install). It does not name the companion read tool or point to update_device_sslvpn_settings for non-portal settings, so routing is clear but not fully enumerated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_wtpA

Update fields on a device-DB managed FortiAP. Only provided fields change.

Repointing wtp_profile drops a reference from the old profile. FortiManager prunes a wtp-profile that no wtp entry references on install (see create_device_wtp), so moving the last AP off a profile loses that profile on the next install_device_settings.

Args: device: Managed device name wtp_id: FortiAP serial number (the wtp-id / table mkey) wtp_profile: New FortiAP (WTP) profile name to assign name: New friendly display name admin: New authorization state: "discovered", "enable" or "disable" location: New free-text location string comment: New free-text comment vdom: VDOM the AP is registered in (default "root")

Returns: Update result

NameRequiredDescriptionDefault
nameNo
vdomNoroot
adminNo
deviceYes
wtp_idYes
commentNo
locationNo
wtp_profileNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does it well: it discloses the partial-update semantics, that repointing wtp_profile drops the reference from the old profile, and that FortiManager prunes an unreferenced wtp-profile on the next install_device_settings. These are non-obvious destructive side effects an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core statement and the highest-risk warning before the parameter list; every sentence earns its place except the trailing 'Returns: Update result', which conveys nothing. Slight verbosity in 'FortiAP (WTP) profile name to assign' but overall tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no annotations, the description supplies update semantics, every parameter's meaning, allowed enum values, and the downstream pruning hazard. An output schema exists, so the thin return note is not a real gap — an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and does: every one of the 8 params is explained beyond its title, including that wtp_id is the FortiAP serial / table mkey, that device is the managed device name, and that admin accepts exactly "discovered", "enable" or "disable" — an enumeration the schema does not encode. The vdom default is also restated with meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: updating fields on a device-DB managed FortiAP, with the partial-update rule ('Only provided fields change') stated up front. It implicitly separates itself from profile-level siblings by noting that wtp_profile here is only a name to assign, but it never names update_device_wtp_profile_radio or update_device_wtp_profile to route the agent explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context: use this to change individual AP fields, and it points to create_device_wtp/install_device_settings for understanding the pruning consequence. There is no explicit when-not-to-use clause or named alternative for editing the profile object itself, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_device_wtp_profile_radioA

Update a single radio's channel and/or channel width on a FortiAP profile.

This is a read-modify-write, like assign_vap_to_wtp_profile: the profile is read first and every other field already on the target radio (band, power, vap-all, vaps, mode, ...) is carried through unchanged, minus a couple of read-only bookkeeping keys the API injects on GET but rejects on write (see _WTP_RADIO_READONLY_KEYS). FortiManager replaces a nested radio object rather than merging into it, so writing back only channel/channel-bonding would reset the rest to defaults on the next install_device_settings.

Args: device: Managed device name profile: FortiAP (WTP) profile name radio: Radio to update, 1-3 channel: Channel(s) to pin the radio to. For radio 1/2 (2.4/5GHz) this is a single-element list, e.g. [36], to pin one channel. For radio 3 (6GHz) at a bonding width above 20MHz, FortiOS represents the wide channel as the full list of its member 20MHz sub-channels rather than a single label -- pass either the single conventional wide-channel label (e.g. [15] for 160MHz channel 15) and it is expanded to the correct member list automatically, or the explicit member list itself (e.g. [1, 5, 9, 13, 17, 21, 25, 29]). channel_bonding: Channel width/bonding, one of WTP_PROFILE_CHANNEL_BONDING_MODES ("20MHz", "40MHz", "80MHz", "160MHz") vdom: VDOM the profile lives in (default "root")

Returns: Update result

NameRequiredDescriptionDefault
vdomNoroot
radioYes
deviceYes
channelNo
profileYes
channel_bondingNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the read-modify-write behavior, preservation of existing radio fields, rejection of read-only bookkeeping keys, and the critical FortiManager behavior where nested radio objects are replaced rather than merged. This directly warns that partial writes could reset fields on the next install_device_settings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and then organized into behavior, args, and returns. It is somewhat long and includes an internal implementation reference (_WTP_RADIO_READONLY_KEYS), but the detail is largely justified by the complexity of channel semantics and the read-modify-write behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of annotations, 0% schema description coverage, and six parameters, the description is complete enough for correct invocation. It covers the mutation behavior, preservation semantics, parameter meanings, and channel edge cases; return values are covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates thoroughly. It explains device, profile, radio range, vdom, channel handling for 2.4/5GHz versus 6GHz wide channels, automatic expansion of conventional wide-channel labels, and allowed channel_bonding values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: updating a single radio's channel and/or channel width on a FortiAP profile. The narrow scope distinguishes it from broader WTP profile operations such as update_device_wtp, even though that sibling is not named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly frames the operation as a read-modify-write and explains that other radio fields are preserved, which helps an agent understand when this tool is appropriate. It does not explicitly compare against get_device_wtp_profile or update_device_wtp, so the when-to-use guidance is strong but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_dlp_profileB

Update a DLP profile's top-level settings.

Only specified fields will be updated.

Args: adom: ADOM name name: Profile name comment: New comment feature_set: Flow or proxy-based inspection ("flow" or "proxy") dlp_log: Enable/disable DLP logging extended_log: Enable/disable extended logging

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
dlp_logNo
feature_setNo
extended_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses partial-update behavior and the return keys, but it does not describe permissions, reversibility, validation, or side effects expected for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The update behavior is front-loaded in two short sentences, followed by structured Args and Returns sections. It is somewhat docstring-like but still efficient and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all parameters, partial-update behavior, and return status, which is adequate for this mutation tool. However, with no annotations and no output-schema reliance, it should say more about permissions or operational constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents all six parameters by name and meaning. It even specifies accepted values for feature_set ("flow" or "proxy") and the intent of dlp_log/extended_log.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: "Update a DLP profile's top-level settings." It is clearly distinguishable from create/get/list/delete DLP profile siblings, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says only specified fields are updated, which implies partial-update usage, but it gives no explicit when-to-use guidance, prerequisites, or comparison with sibling tools such as create/get/delete DLP profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_dnsfilter_profileA

Update an existing DNS filter profile.

Only specified fields will be updated.

Args: adom: ADOM name name: Profile name comment: New comment (optional) block_action: New blocked-domain action - "block", "redirect", or "block-sevrfail" (optional) block_botnet: New botnet C&C blocking setting - "enable" or "disable" (optional) safe_search: New safe search setting - "enable" or "disable" (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
safe_searchNo
block_actionNo
block_botnetNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it usefully discloses partial-update behavior and the shape of the return payload. It omits operationally important context for this FortiManager-style tool: that changes likely require a commit_adom step to take effect, permission/prerequisite needs, and error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose, then a scoping rule, then a compact Args/Returns block. No filler; each line maps to a parameter or output key.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, partial-update semantics, all parameter meanings, and return keys; the output schema makes the Returns section largely redundant. The main omission is the post-update commit requirement typical of ADOM object mutations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it documents all six parameters including allowed values for block_action ("block", "redirect", "block-sevrfail") and enable/disable for block_botnet and safe_search — enums that the schema itself lacks. The adom and name entries are brief but sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an existing DNS filter profile') and the word 'existing' implicitly separates it from create_dnsfilter_profile. It does not explicitly name siblings such as get_dnsfilter_profile or delete_dnsfilter_profile, but the operation is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Only specified fields will be updated' implies partial-update semantics and the need for a pre-existing profile, but there is no explicit when-to-use/when-not guidance and no routing to alternatives like create_dnsfilter_profile for new profiles.

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 an existing firewall policy.

Only the specified fields will be updated; other fields remain unchanged.

Args: adom: ADOM name package: Policy package name policyid: Policy ID to update name: New policy name (optional) srcintf: New source interfaces (optional) dstintf: New destination interfaces (optional) srcaddr: New source addresses (optional) dstaddr: New destination addresses (optional) service: New services (optional) action: New action - "accept" or "deny" (optional) schedule: New schedule (optional) nat: Enable/disable NAT (optional) logtraffic: New log mode (optional) status: New status (optional) comments: New comments (optional) global_label: Policy section label (optional) global_label_color: Policy section color ID 0-31 (optional) srcaddr_negate: Match all sources EXCEPT srcaddr (optional; None leaves the field untouched, like every other optional field) dstaddr_negate: Match all destinations EXCEPT dstaddr (optional) service_negate: Match all services EXCEPT service (optional) utm_status: Enable/disable security profile inspection (optional) av_profile: Antivirus profile name (optional) ips_sensor: IPS sensor name (optional) webfilter_profile: Web filter profile name (optional) dnsfilter_profile: DNS filter profile name (optional) application_list: Application control list name (optional) file_filter_profile: File filter profile name (optional) ssl_ssh_profile: SSL/SSH inspection profile name (optional) profile_protocol_options: Protocol options profile name (optional). Mutually exclusive with profile_group in the same call -- it is itself a member of the FortiOS firewall profile-group object profile_group: Security profile group name (optional). Mutually exclusive with av_profile, ips_sensor, webfilter_profile, dnsfilter_profile, application_list, file_filter_profile, ssl_ssh_profile, and profile_protocol_options in the same call

Note: Sending any individual security-profile field (av_profile, ssl_ssh_profile, profile_protocol_options, etc.) on a policy that is currently in group mode flips profile-type to "single" on the appliance. The previously-stored profile-group value becomes dormant (not deleted) rather than staying active alongside the new field -- FortiOS only honors one profile-type at a time.

Returns: dict: Update result with keys: - status: "success" or "error" - policyid: Updated policy ID - message: Status or error message

Example: >>> # Disable a policy >>> result = await update_firewall_policy( ... adom="root", ... package="default", ... policyid=10, ... status="disable" ... )

>>> # Update source addresses
>>> result = await update_firewall_policy(
...     adom="root",
...     package="default",
...     policyid=10,
...     srcaddr=["New-Subnet", "Other-Subnet"]
... )
NameRequiredDescriptionDefault
natNo
adomYes
nameNo
actionNo
statusNo
dstaddrNo
dstintfNo
packageYes
serviceNo
srcaddrNo
srcintfNo
commentsNo
policyidYes
scheduleNo
av_profileNo
ips_sensorNo
logtrafficNo
utm_statusNo
global_labelNo
profile_groupNo
dstaddr_negateNo
service_negateNo
srcaddr_negateNo
ssl_ssh_profileNo
application_listNo
dnsfilter_profileNo
webfilter_profileNo
global_label_colorNo
file_filter_profileNo
profile_protocol_optionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does unusually well: it discloses a non-obvious side effect (sending an individual profile field flips `profile-type` to 'single' on the appliance and leaves the stored `profile-group` dormant, not deleted) and explains that None leaves every optional field untouched. Gaps remain on permissions/ADOM-lock requirements and whether the change only takes effect after install_package/commit_adom, which matter for a firewall mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior and the partial-update rule are front-loaded in the first two sentences, and the long Args block earns most of its length given 30 undocumented parameters. The 'Returns' block is pure duplication since an output schema already exists, and the examples add bulk beyond the necessary minimum.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 30-parameter FortiOS mutation with zero annotation coverage, the description supplies partial-update semantics, mutual-exclusion rules, negate-flag behavior, a profile-type side effect, and examples. What is missing is environmental context: ADOM locking, whether a subsequent commit/install is required for changes to take effect, and error conditions — all relevant given the tool's blast radius. Return values need not be here since an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 30 parameters, so the description is the only source of meaning, and it annotates essentially every parameter including value constraints ('accept' or 'deny', 'color ID 0-31') and the negate-flag semantics. Several entries stay terse ('New schedule (optional)', 'New services (optional)') without saying what identifiers are valid or where to look them up, so it is thorough but not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an existing firewall policy') and immediately clarifies the partial-update semantics ('Only the specified fields will be updated'). An agent can distinguish it from create_firewall_policy or delete_firewall_policy by name alone, but the description never names or contrasts those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The partial-update sentence plus two worked examples (disabling a policy, replacing srcaddr) give clear operational context for when this tool is the right call. It also encodes a real usage constraint ('profile_group ... mutually exclusive with av_profile, ips_sensor, ... in the same call'). It stops short of naming alternatives such as move_firewall_policy for reordering or revert_firewall_policy for rollback, and says nothing about the ADOM lock or package-install prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_ips_sensorA

Update an IPS sensor's top-level settings.

Only specified fields will be updated. To change signature filters/overrides use add_ips_sensor_signature_override / remove_ips_sensor_signature_override instead.

Args: adom: ADOM name name: Sensor name comment: New comment block_malicious_url: Enable/disable malicious URL blocking scan_botnet_connections: Botnet-server connection handling ("disable", "block", or "monitor") extended_log: Enable/disable extended logging

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
extended_logNo
block_malicious_urlNo
scan_botnet_connectionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose the important partial-update behavior and lists the return keys (status/message), which is real added context. It says nothing about required permissions, whether a commit is needed for changes to take effect, or the effect on unlisted settings, leaving meaningful behavioral gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the sibling exclusion, then Args and Returns. The Returns block mostly restates the output schema, slightly redundant, but nothing else is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation tool with 0% schema coverage and no annotations, the description covers purpose, partial-update semantics, all parameter meanings, and return keys. Missing pieces are operational (ADOM lock, commit requirement) rather than core to invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description compensates by documenting all six parameters, including allowed values for scan_botnet_connections ("disable", "block", "monitor"). Values for block_malicious_url and extended_log are only implied as enable/disable, so the string-typed fields remain slightly ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update an IPS sensor's top-level settings") and immediately scopes it to top-level settings, which separates it from the signature-override siblings named in the text. An agent can tell this apart from add/remove_ips_sensor_signature_override without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent away from this tool for signature work: "To change signature filters/overrides use add_ips_sensor_signature_override / remove_ips_sensor_signature_override instead." It also states the partial-update rule ("Only specified fields will be updated"), giving clear context, though it omits any note about prerequisites such as locking the ADOM before mutation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_local_in_policyA

Update an existing IPv4 local-in policy.

Only the specified fields will be updated; other fields remain unchanged.

Args: adom: ADOM name package: Policy package name policyid: Local-in policy ID to update action: New action - "accept" or "deny" (optional) intf: New incoming interface(s) (optional) srcaddr: New source addresses (optional) dstaddr: New destination addresses (optional) service: New services (optional) schedule: New schedule (optional) status: New status - "enable" or "disable" (optional) logtraffic: New local-in traffic logging setting (optional) comments: New comments (optional) srcaddr_negate: Match all sources EXCEPT srcaddr (optional) dstaddr_negate: Match all destinations EXCEPT dstaddr (optional) service_negate: Match all services EXCEPT service (optional) ha_mgmt_intf_only: Restrict this policy to the HA management interface only (optional). IPv4-only field. virtual_patch: Enable/disable virtual patching on this policy (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - policyid: Updated policy ID - message: Status or error message

Example: >>> # Disable a local-in policy >>> result = await update_local_in_policy( ... adom="root", ... package="default", ... policyid=1, ... status="disable" ... )

NameRequiredDescriptionDefault
adomYes
intfNo
actionNo
statusNo
dstaddrNo
packageYes
serviceNo
srcaddrNo
commentsNo
policyidYes
scheduleNo
logtrafficNo
virtual_patchNo
dstaddr_negateNo
service_negateNo
srcaddr_negateNo
ha_mgmt_intf_onlyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It usefully discloses partial-update semantics ('Only the specified fields will be updated') and describes optional fields, but does not mention permissions, ADOM lock/commit requirements, reversibility, or side effects of changing a local-in policy.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and partial-update behavior are front-loaded, followed by a structured Args section and a short example. It is appropriately sized for a 17-parameter tool, though the Returns section is somewhat redundant because an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with no annotations, the description covers purpose, all parameters, partial-update behavior, return shape, and an example. It could be more complete by mentioning operational requirements such as ADOM locking or committing changes, but it is otherwise sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It lists all 17 parameters with meaningful labels, marks optionals, gives accepted values for action/status, and explains negate and HA management interface semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update an existing IPv4 local-in policy.' The IPv4 qualifier distinguishes it from the IPv6 local-in policy tools, and 'existing' distinguishes it from the create sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies use for updating an existing policy and includes a disable example, but gives no explicit when-to-use guidance, exclusions, prerequisites, or alternatives such as get_local_in_policy or update_local_in_policy6.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_local_in_policy6A

Update an existing IPv6 local-in policy.

Only the specified fields will be updated; other fields remain unchanged.

Args: adom: ADOM name package: Policy package name policyid: Local-in policy6 ID to update action: New action - "accept" or "deny" (optional) intf: New incoming interface(s) (optional) srcaddr: New source IPv6 addresses (optional) dstaddr: New destination IPv6 addresses (optional) service: New services (optional) schedule: New schedule (optional) status: New status - "enable" or "disable" (optional) logtraffic: New local-in traffic logging setting (optional) comments: New comments (optional) srcaddr_negate: Match all sources EXCEPT srcaddr (optional) dstaddr_negate: Match all destinations EXCEPT dstaddr (optional) service_negate: Match all services EXCEPT service (optional) virtual_patch: Enable/disable virtual patching on this policy (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - policyid: Updated policy ID - message: Status or error message

Example: >>> result = await update_local_in_policy6( ... adom="root", ... package="default", ... policyid=1, ... status="disable" ... )

NameRequiredDescriptionDefault
adomYes
intfNo
actionNo
statusNo
dstaddrNo
packageYes
serviceNo
srcaddrNo
commentsNo
policyidYes
scheduleNo
logtrafficNo
virtual_patchNo
dstaddr_negateNo
service_negateNo
srcaddr_negateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does describe the merge-style update behavior and the return shape, including status 'success'/'error', but it says nothing about permissions, ADOM locking, whether a follow-up commit is needed, or what happens when policyid does not exist. That leaves significant behavioral gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, followed by well-structured Args, Returns, and Example sections. The length is justified by the 16 undocumented parameters, and the example clarifies the call shape, though the Returns block partly duplicates the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter mutation tool with no annotations, the description covers every parameter, the merge semantics, and the return contract. The remaining gap concerns prerequisites and side effects, such as locking, commit, and failure modes, but otherwise it is sufficient to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the Args block is the only documentation for all 16 parameters, and it largely compensates: it explains enums ('accept'/'deny', 'enable'/'disable'), shows list versus scalar types, and spells out negate flags as 'Match all sources EXCEPT srcaddr.' A few entries are thin, such as 'New incoming interface(s)' and 'New local-in traffic logging setting'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Update an existing IPv6 local-in policy.' That is enough to distinguish it from its siblings: create_local_in_policy6, get_local_in_policy6, and delete_local_in_policy6. It never names those siblings, but the verb makes the distinction unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence 'Only the specified fields will be updated; other fields remain unchanged' establishes the partial-update semantics, so the usage is implied rather than spelled out. It never says when to choose this tool over create_local_in_policy6, or what is required first, such as an ADOM lock or a commit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_scriptA

Update an existing CLI script.

Args: adom: ADOM name name: Script name to update content: New script content description: New description script_type: New script type target: New target

Returns: Updated script details

NameRequiredDescriptionDefault
adomYes
nameYes
targetNo
contentNo
descriptionNo
script_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. The description only says 'Update an existing CLI script,' indicating mutation but lacks details on side effects, error conditions, or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using a clear docstring format with sections for Args and Returns. No unnecessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the basic purpose and parameters but does not address partial updates, validation rules, or output format details. Adequate but not comprehensive for a 6-parameter mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description adds value by listing each parameter with a brief explanation (e.g., 'adom: ADOM name', 'content: New script content'), clarifying their role beyond the schema's property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Update an existing CLI script,' clearly indicating the verb and resource. It distinguishes from sibling tools like create_script and delete_script.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives, prerequisites (e.g., script must exist), or conditions that would make another tool more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_serviceB

Update a service object.

Args: adom: ADOM name name: Service name tcp_portrange: New TCP port range udp_portrange: New UDP port range comment: New comment

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
tcp_portrangeNo
udp_portrangeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but only states 'Update a service object.' without disclosing behavior like whether updates are partial/full, idempotency, or side effects. The return format is specified but insufficient for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with purpose, and structured with Args/Returns sections. Every sentence is informative with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers return values via output schema mention and descriptions, but lacks context on side effects, error cases, or prerequisites. Adequate for a simple update tool but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description adds value by explaining each parameter's purpose (e.g., 'New TCP port range'), but lacks format details (e.g., '80-443' or comma-separated). Adequate but not comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update a service object.' with specific updatable fields (tcp_portrange, udp_portrange, comment), distinguishing it from sibling tools like update_address or delete_service.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., create_service, delete_service) or prerequisites. The description only states what it does, not when to use it.

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.

Args: adom: ADOM name name: Group name members: New member list (replaces existing) comment: New comment

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
membersNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It does add one genuinely useful behavioral detail, that `members` replaces the existing list, and returns a status/message dict. However it says nothing about required permissions, ADOM locking, reversibility, or what happens to omitted fields, which is a meaningful gap for a mutation tool without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One-line purpose followed by an Args block and a Returns block; every line carries content and the purpose is front-loaded. Nothing is padded or repetitive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter mutation tool with no annotations this is only adequate: the parameters are covered, but call prerequisites (locking the ADOM, whether the group must already exist) are unstated. The Returns section is redundant given an output schema already exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all four parameters get short glosses, including the important semantic note that `members` replaces rather than appends. It stops short of specifying whether members are object names or references, but it adds real meaning beyond the bare titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Update a service group") and enumerates the fields that can be changed. It does not distinguish this tool from siblings such as update_address_group, create_service_group, or delete_service_group, so an agent gets a clear purpose but no sibling routing help.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus create_service_group, get_service_group, or the address-group equivalents. No prerequisites (e.g., ADOM lock, existing group requirement) or exclusions are given; the description is purely a field list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_ssl_ssh_profileA

Update an SSL/SSH inspection profile.

Only specified fields will be updated.

Args: adom: ADOM name name: Profile name comment: New comment ssl_inspection: Generic SSL inspection level ("disable", "certificate-inspection", or "deep-inspection") https_inspection: HTTPS inspection level ("disable", "certificate-inspection", or "deep-inspection") caname: New CA certificate(s) (datasource names, replaces existing) untrusted_caname: New untrusted CA certificate(s) (replaces existing) server_cert: New server certificate(s) (replaces existing) server_cert_mode: Re-sign or replace the server's certificate mapi_over_https: Enable/disable inspection of MAPI over HTTPS rpc_over_https: Enable/disable inspection of RPC over HTTPS

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
canameNo
commentNo
server_certNo
rpc_over_httpsNo
ssl_inspectionNo
mapi_over_httpsNo
https_inspectionNo
server_cert_modeNo
untrusted_canameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does substantial work: it discloses PATCH-style partial update semantics and explicitly flags which fields replace existing values wholesale (caname, untrusted_caname, server_cert). It omits permission/lock requirements, reversibility, and whether a follow-up commit is needed, which keeps it below a 5 for an unannotated mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The update semantics and partial-update caveat are front-loaded, followed by a scannable per-argument list. The Returns block partially duplicates the existing output schema, which is wasted space, but overall the text is efficient for an 11-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All parameters are explained and the return keys are described (redundantly, since an output schema exists). For a mutation tool the main missing pieces are operational context: required permissions, ADOM lock state, and whether a commit follows.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents all 11 parameters including the array-replacement behavior for certificate fields. It supplies enumerated values for ssl_inspection and https_inspection but leaves server_cert_mode, mapi_over_https, and rpc_over_https under-specified (no explicit value set beyond "Enable/disable").

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update an SSL/SSH inspection profile") that is trivially separable from sibling create_/get_/list_/delete_ssl_ssh_profile tools. It doesn't explicitly name those siblings or the scope of the object being modified, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Only specified fields will be updated" implies this is the tool for partial modification of an existing profile, which is useful. However, there is no statement about prerequisites (e.g., the profile must exist, ADOM locking, whether a commit is required afterward) or when to prefer this over delete-and-recreate or create_ssl_ssh_profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_waf_profileA

Update a WAF profile's top-level settings.

Only specified fields will be updated.

Args: adom: ADOM name name: Profile name comment: New comment external: Enable/disable external HTTP inspection extended_log: Enable/disable extended logging

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
externalNo
extended_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses the partial-update behavior and return status keys, but it omits important mutation context such as whether an ADOM lock or commit is required, whether changes are immediately applied, and what permissions are needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and partial-update behavior, then lists parameters and return values cleanly. The Returns section is somewhat redundant because an output schema exists, but the overall structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, partial-update semantics, parameters, and return values. However, for a mutation tool with no annotations in a FortiManager context, it should ideally mention prerequisites, ADOM lock/commit implications, and whether changes are staged or applied immediately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It documents all five parameters, including adom, name, comment, external, and extended_log, and clarifies that external and extended_log are enable/disable toggles, though it does not specify exact allowed string values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Update a WAF profile's top-level settings.' This clearly distinguishes it from sibling operations like create_waf_profile, get_waf_profile, delete_waf_profile, and list_waf_profiles, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The statement 'Only specified fields will be updated' gives implied usage guidance for partial updates, but the description does not explicitly say when to use this tool versus create_waf_profile or get_waf_profile, nor does it state prerequisites such as the profile needing to already exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_webfilter_profileA

Update an existing web filter profile.

Only specified fields will be updated.

Args: adom: ADOM name name: Profile name comment: New comment (optional) feature_set: New flow/proxy feature set - "proxy" or "flow" (optional) log_all_url: New "log all URLs" setting - "enable" or "disable" (optional) web_content_log: New blocked-content logging setting - "enable" or "disable" (optional)

Returns: dict: Update result with keys: - status: "success" or "error" - message: Status or error message

NameRequiredDescriptionDefault
adomYes
nameYes
commentNo
feature_setNo
log_all_urlNo
web_content_logNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses partial-update behavior (unspecified fields untouched) and the return shape (status/message), but omits operational behavior critical for a mutation tool: ADOM lock requirements, whether changes require commit_adom to take effect, and whether the profile name itself is mutable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and the partial-update rule are front-loaded, followed by an organized Args list. The Returns block is somewhat redundant given an output schema exists, but the overall structure is clean and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation tool with zero schema descriptions, the description covers all inputs and the response shape well. The remaining gap is workflow context — lock/commit expectations — which an agent would need to call this safely in this FortiManager-style environment.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the six parameters is explained, including the allowed values for feature_set ("proxy" or "flow") and the enable/disable enums for log_all_url and web_content_log, plus which are optional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Update an existing web filter profile"), which is unambiguous and distinguishable from create/delete/get siblings by the verb. It does not explicitly name the sibling alternatives, but the operation is self-evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Update an existing" implies the profile must already exist, and "Only specified fields will be updated" clarifies partial-update semantics. However, there is no explicit guidance on when to use this versus create_webfilter_profile, nor any mention of prerequisites such as locking the ADOM or committing afterward.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upgrade_device_firmwareA

Trigger a firmware upgrade on a managed device.

Device-affecting: this reboots the device onto the new firmware. Asynchronous -- FortiManager runs the upgrade as a background task (create_task="enable" is always sent) and this returns immediately with a task_id. Poll it with get_task/wait_for_task rather than assuming success from this call's return.

Strongly recommended to call get_firmware_upgrade_path first: FMG may need to step the device through intermediate versions to reach the target, and this tool upgrades straight to target_version without walking that path itself.

Safety: governed by FMG_FIRMWARE_SAFETY (default "strict"), same pattern as trigger_fmg_restore -- refused unless confirm=True is also passed. A firmware upgrade reboots a real managed device onto new code; there is no dry-run and no content to screen, so the gate is a plain explicit confirmation. This is unrelated to spawn_guarded below, which only bounds concurrency, not whether the call is allowed to happen at all. Set FMG_FIRMWARE_SAFETY=disabled to remove the gate.

Args: device: Managed device name target_version: Target firmware version, e.g. "7.2.9-b1688" adom: ADOM name (default: from DEFAULT_ADOM env var, or "root") vdom: VDOM to scope the request to (optional) flags: One upgrade flag (optional): "f_boot_alt_partition" (boot from alternate partition after upgrade), "f_skip_retrieve" (don't retrieve device config after upgrade), "f_skip_multi_steps" (skip the multi-step upgrade process), "f_skip_fortiguard_img" (let the device download firmware from FortiGuard itself) schedule_time: Schedule the upgrade for a future time instead of running it immediately (optional; FMG-native time format) confirm: Must be True to proceed under FMG_FIRMWARE_SAFETY=strict (default). Ignored when FMG_FIRMWARE_SAFETY=disabled.

Returns: dict: Trigger result with keys: - status: "success" or "error" - task_id: Task ID for monitoring (if successful) - message: Status or error message

Example: >>> path = await get_firmware_upgrade_path("FGT-HQ", "7.2.9-b1688") >>> result = await upgrade_device_firmware( ... "FGT-HQ", "7.2.9-b1688", confirm=True ... ) >>> if result["status"] == "success": ... await wait_for_task(result["task_id"], timeout=1800)

NameRequiredDescriptionDefault
adomNo
vdomNo
flagsNo
deviceYes
confirmNo
schedule_timeNo
target_versionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does so: it discloses that the device reboots onto new code, that the operation is asynchronous background work returning a task_id, that there is no dry-run, and that an environment-variable safety gate refuses calls without confirm=True. It even disambiguates its gate from a concurrency limiter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The critical facts (device reboot, async task_id, confirm gate) are front-loaded in the first paragraphs, and the Args/Returns/Example blocks are well-structured. It is longer than strictly necessary — the spawn_guarded aside and the Returns block partially duplicate information available elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, asynchronous, gated operation with seven undocumented-in-schema parameters, the description supplies everything needed: safety gate, async polling, version-path caveat, flag meanings, and an end-to-end example. The output schema and the inline Returns block together leave no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the Args section compensates fully: every one of the seven parameters is documented, including the four enumerated values of flags with their meanings, the adom default resolution chain, the schedule_time format source, and the exact confirm gate behavior. This is meaningfully more than the bare types in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Trigger a firmware upgrade on a managed device') and immediately distinguishes itself from siblings by naming get_firmware_upgrade_path, trigger_fmg_restore, and get_task/wait_for_task. An agent can identify the tool and its role without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit sequencing guidance is given: call get_firmware_upgrade_path first because this tool does not walk intermediate versions, poll with get_task/wait_for_task instead of trusting the return, and pass confirm=True under the default safety mode. Alternatives and prerequisites are named rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_templateA

Validate a template group for a device.

Checks that all metadata variables are resolved for the device.

Args: adom: ADOM name template_group: Template group name device: Target device name vdom: VDOM name (default: root)

Returns: Task ID for monitoring validation progress

NameRequiredDescriptionDefault
adomYes
vdomNoroot
deviceYes
template_groupYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description carries full burden. It states a read-only check ('validates', 'checks') and mentions async behavior (returns Task ID). Does not explicitly confirm non-destructive, but enough context is given.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is very concise: a one-sentence summary followed by bulleted Args and a Returns note. No fluff, information is front-loaded and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes core functionality and return type (Task ID). Does not mention prerequisites like device or template group existence, but given 4 parameters and an output schema, the description is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It lists parameters with generic qualifiers ('ADOM name', 'Template group name') but adds no extra constraints or format details. Barely above bare schema naming.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Validate' and identifies the resource 'template group for a device'. It explains the check (metadata variables resolved), distinguishing it from siblings like 'assign_template_group' or 'get_template_group'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (pre-deployment validation) but does not explicitly state when not to use or provide alternatives. The context is clear but lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_taskA

Wait for a task to complete.

Polls the task status until it completes or times out. Useful for waiting on installation or provisioning operations.

Args: task_id: Task ID number timeout: Maximum wait time in seconds (default: 300, capped at 3600) poll_interval: Seconds between status checks (default: 5)

Returns: dict: Final task status with keys: - status: "success" or "error" - task: Final task object - completed: Whether task completed (vs timeout) - message: Status or error message

Example: >>> # Wait for policy installation >>> result = await wait_for_task(12345, timeout=600) >>> if result['completed']: ... print("Installation finished!")

NameRequiredDescriptionDefault
task_idYes
timeoutNo
poll_intervalNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It explains polling until completion or timeout, includes timeout cap at 3600s, and describes the return dict. It does not detail error behavior or side effects, but the output schema covers return states. Transparency is high.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args, Returns, and Example sections. It is concise, front-loaded with purpose, and every sentence adds value. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema explains return values, the description covers all needed aspects: parameters, behavior, and usage example. It is complete for a polling utility tool with clear constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains task_id, timeout (with default 300 and cap 3600), and poll_interval (default 5) clearly. This adds significant meaning beyond the schema, which lacks descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Wait for a task to complete' with a polling mechanism. It distinguishes from sibling tools that perform other operations like install, execute, or get. The specific verb 'wait' and resource 'task' make purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Useful for waiting on installation or provisioning operations,' providing clear context. It suggests when to use this tool, though it could explicitly mention that it should be used after starting an async operation. Still, it gives good guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 132 tool updatesv1.12.0
    • Addedadd_device_to_group
    • Addedadd_devices_to_group_bulk
    • Addedadd_group_to_group
    • Addedadd_ips_sensor_signature_override
    • Addedadd_packet_capture
    • Addedassign_vap_to_wtp_profile
    • Addedcreate_antivirus_profile
    • Addedcreate_application_list
    • Addedcreate_device_dhcp_server
    • Addedcreate_device_group
    • Addedcreate_device_interface
    • Addedcreate_device_ipsec_phase1_interface
    • Addedcreate_device_ipsec_phase2_interface
    • Addedcreate_device_on_demand_sniffer
    • Addedcreate_device_sniffer
    • Addedcreate_device_vap
    • Addedcreate_device_wtp
    • Addedcreate_dlp_profile
    • Addedcreate_dnsfilter_profile
    • Changedcreate_firewall_policy13 fields changed
      • addedInput schema / properties / application_list
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Application List"
        +}
      • addedInput schema / properties / av_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Av Profile"
        +}
      • addedInput schema / properties / dnsfilter_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Dnsfilter Profile"
        +}
      • addedInput schema / properties / dstaddr_negate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Dstaddr Negate"
        +}
      • addedInput schema / properties / file_filter_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "File Filter Profile"
        +}
      • addedInput schema / properties / ips_sensor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ips Sensor"
        +}
      • addedInput schema / properties / profile_group
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Profile Group"
        +}
      • addedInput schema / properties / profile_protocol_options
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Profile Protocol Options"
        +}
      • addedInput schema / properties / service_negate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Service Negate"
        +}
      • addedInput schema / properties / srcaddr_negate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Srcaddr Negate"
        +}
      • addedInput schema / properties / ssl_ssh_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ssl Ssh Profile"
        +}
      • addedInput schema / properties / utm_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Utm Status"
        +}
      • addedInput schema / properties / webfilter_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Webfilter Profile"
        +}
    • Addedcreate_ips_sensor
    • Addedcreate_local_in_policy
    • Addedcreate_local_in_policy6
    • Addedcreate_ssl_ssh_profile
    • Addedcreate_waf_profile
    • Addedcreate_webfilter_profile
    • Addeddelete_antivirus_profile
    • Addeddelete_application_list
    • Addeddelete_device_dhcp_server
    • Addeddelete_device_group
    • Addeddelete_device_interface
    • Addeddelete_device_ipsec_phase1_interface
    • Addeddelete_device_ipsec_phase2_interface
    • Addeddelete_device_vap
    • Addeddelete_device_wtp
    • Addeddelete_dlp_profile
    • Addeddelete_dnsfilter_profile
    • Addeddelete_ips_sensor
    • Addeddelete_local_in_policy
    • Addeddelete_local_in_policy6
    • Addeddelete_ssl_ssh_profile
    • Addeddelete_task
    • Addeddelete_waf_profile
    • Addeddelete_webfilter_profile
    • Addeddiff_adom_revision
    • Addeddiff_device_revision
    • Addeddiff_policy_package
    • Addedfind_duplicate_objects
    • Addedfind_object_usage
    • Addedget_adom_revision
    • Addedget_antivirus_profile
    • Addedget_application_list
    • Addedget_device_client_location
    • Addedget_device_interface_config
    • Addedget_device_ipsec_phase1_interface
    • Addedget_device_ipsec_phase2_interface
    • Addedget_device_revision
    • Addedget_device_sdwan
    • Addedget_device_sdwan_monitor
    • Addedget_device_sslvpn_settings
    • Addedget_device_sslvpn_web_portal
    • Addedget_device_wtp
    • Addedget_device_wtp_profile
    • Addedget_dlp_profile
    • Addedget_dnsfilter_profile
    • Addedget_firmware_upgrade_path
    • Addedget_firmware_upgrade_report
    • Addedget_fmg_license
    • Addedget_ips_sensor
    • Addedget_local_in_policy
    • Addedget_local_in_policy6
    • Addedget_packet_capture_status
    • Addedget_ssl_ssh_profile
    • Addedget_waf_profile
    • Addedget_webfilter_profile
    • Addedlist_adom_revisions
    • Addedlist_antivirus_profiles
    • Addedlist_application_lists
    • Addedlist_available_firmware
    • Addedlist_device_dhcp_servers
    • Addedlist_device_ipsec_phase1_interfaces
    • Addedlist_device_ipsec_phase2_interfaces
    • Addedlist_device_revisions
    • Addedlist_device_vaps
    • Addedlist_device_wtp_profiles
    • Addedlist_device_wtps
    • Addedlist_dlp_profiles
    • Addedlist_dnsfilter_profiles
    • Addedlist_firmware_images
    • Addedlist_ips_sensor_signature_overrides
    • Addedlist_ips_sensors
    • Addedlist_local_in_policies
    • Addedlist_local_in_policies6
    • Addedlist_packet_captures
    • Addedlist_policy_revisions
    • Addedlist_ssl_ssh_profiles
    • Addedlist_waf_profiles
    • Addedlist_webfilter_profiles
    • Addedpolicy_lookup
    • Addedremove_device_from_group
    • Addedremove_devices_from_group_bulk
    • Addedremove_group_from_group
    • Addedremove_ips_sensor_signature_override
    • Addedresolve_datasource
    • Addedrevert_adom_revision
    • Addedrevert_device_revision
    • Addedrevert_firewall_policy
    • Addedstart_packet_capture
    • Addedstop_packet_capture
    • Addedtrigger_fmg_backup
    • Addedtrigger_fmg_restore
    • Addedupdate_antivirus_profile
    • Addedupdate_application_list
    • Addedupdate_device_dhcp_server
    • Addedupdate_device_interface
    • Addedupdate_device_ipsec_phase1_interface
    • Addedupdate_device_ipsec_phase2_interface
    • Addedupdate_device_sslvpn_settings
    • Addedupdate_device_sslvpn_web_portal
    • Addedupdate_device_wtp
    • Addedupdate_device_wtp_profile_radio
    • Addedupdate_dlp_profile
    • Addedupdate_dnsfilter_profile
    • Changedupdate_firewall_policy13 fields changed
      • addedInput schema / properties / application_list
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Application List"
        +}
      • addedInput schema / properties / av_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Av Profile"
        +}
      • addedInput schema / properties / dnsfilter_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Dnsfilter Profile"
        +}
      • addedInput schema / properties / dstaddr_negate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Dstaddr Negate"
        +}
      • addedInput schema / properties / file_filter_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "File Filter Profile"
        +}
      • addedInput schema / properties / ips_sensor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ips Sensor"
        +}
      • addedInput schema / properties / profile_group
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Profile Group"
        +}
      • addedInput schema / properties / profile_protocol_options
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Profile Protocol Options"
        +}
      • addedInput schema / properties / service_negate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Service Negate"
        +}
      • addedInput schema / properties / srcaddr_negate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Srcaddr Negate"
        +}
      • addedInput schema / properties / ssl_ssh_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ssl Ssh Profile"
        +}
      • addedInput schema / properties / utm_status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Utm Status"
        +}
      • addedInput schema / properties / webfilter_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Webfilter Profile"
        +}
    • Addedupdate_ips_sensor
    • Addedupdate_local_in_policy
    • Addedupdate_local_in_policy6
    • Addedupdate_service_group
    • Addedupdate_ssl_ssh_profile
    • Addedupdate_waf_profile
    • Addedupdate_webfilter_profile
    • Addedupgrade_device_firmware
  2. 1 tool updatev1.7.1
    • Addedvalidate_template
  3. 102 tool updates
    • First observedadd_device
    • First observedadd_devices_bulk
    • First observedadd_model_device
    • First observedassign_package
    • First observedassign_sdwan_template
    • First observedassign_sdwan_template_bulk
    • First observedassign_system_template
    • First observedassign_system_template_bulk
    • First observedassign_template_group
    • First observedclone_package
    • First observedcommit_adom
    • First observedcreate_address_fqdn
    • First observedcreate_address_group
    • First observedcreate_address_host
    • First observedcreate_address_range
    • First observedcreate_address_subnet
    • First observedcreate_cli_template_group
    • First observedcreate_firewall_policy
    • First observedcreate_package
    • First observedcreate_script
    • First observedcreate_sdwan_template
    • First observedcreate_service_group
    • First observedcreate_service_icmp
    • First observedcreate_service_tcp_udp
    • First observeddelete_address
    • First observeddelete_address_group
    • First observeddelete_cli_template_group
    • First observeddelete_device
    • First observeddelete_devices_bulk
    • First observeddelete_firewall_policies_bulk
    • First observeddelete_firewall_policy
    • First observeddelete_package
    • First observeddelete_script
    • First observeddelete_sdwan_template
    • First observeddelete_service
    • First observeddelete_service_group
    • First observedexecute_script_on_device
    • First observedexecute_script_on_device_group
    • First observedexecute_script_on_devices
    • First observedexecute_script_on_package
    • First observedget_address
    • First observedget_address_group
    • First observedget_adom
    • First observedget_cli_template_group
    • First observedget_device
    • First observedget_device_interfaces
    • First observedget_device_realtime_status
    • First observedget_device_status
    • First observedget_firewall_policy
    • First observedget_ha_status
    • First observedget_package
    • First observedget_policy_services
    • First observedget_preview_result
    • First observedget_script
    • First observedget_script_log_latest
    • First observedget_script_log_output
    • First observedget_script_log_summary
    • First observedget_sdwan_template
    • First observedget_service
    • First observedget_service_group
    • First observedget_system_status
    • First observedget_system_template
    • First observedget_task
    • First observedget_template
    • First observedget_template_group
    • First observedhealth_check
    • First observedinstall_device_settings
    • First observedinstall_package
    • First observedlist_address_groups
    • First observedlist_addresses
    • First observedlist_adoms
    • First observedlist_cli_template_groups
    • First observedlist_device_groups
    • First observedlist_device_vdoms
    • First observedlist_devices
    • First observedlist_firewall_policies
    • First observedlist_packages
    • First observedlist_scripts
    • First observedlist_sdwan_templates
    • First observedlist_service_groups
    • First observedlist_services
    • First observedlist_system_templates
    • First observedlist_tasks
    • First observedlist_template_groups
    • First observedlist_templates
    • First observedlock_adom
    • First observedmove_firewall_policy
    • First observedpreview_install
    • First observedreload_device_list
    • First observedsearch_devices
    • First observedsearch_firewall_policies
    • First observedsearch_objects
    • First observedunassign_sdwan_template
    • First observedunassign_system_template
    • First observedunlock_adom
    • First observedupdate_address
    • First observedupdate_address_group
    • First observedupdate_device
    • First observedupdate_firewall_policy
    • First observedupdate_script
    • First observedupdate_service
    • First observedwait_for_task

TDQS

B3.2/5.0

Scored across 233 tools

Disambiguation2/5

The set has many large familes with overlapping boundaries: list_templates/list_system_templates/list_sdwan_templates/list_cli_template_groups/list_template_groups, get_device_interfaces vs get_device_interface_config, device sniffer vs on-demand sniffer vs FortiManager packet capture, and several revision/diff tools. Descriptions usually explain the difference, but with 233 tools an agent will frequently face plausible near-matches.

Naming Consistency4/5

Names are consistently snake_case and mostly follow a verb_noun pattern (list_*, get_*, create_*, update_*, delete_*). Minor deviations exist where add_* is used instead of create_* for devices/groups/templates, and IPv6/local-in variants introduce suffixes like local_in_policies6, but the overall convention remains readable.

Tool Count1/5

233 tools is far beyond a practical MCP tool surface; even for a broad platform like FortiManager, the set is too large to select from reliably and should be consolidated into fewer domain-level tools. The count alone creates a severe context and misselection burden.

Completeness4/5

Coverage is extensive across ADOMs, devices, device-DB objects, firewall policies, local-in policies, security profiles, templates, SD-WAN, revisions, scripts, firmware, and tasks. There are still lifecycle gaps, such as limited create/update/delete coverage for some template families and missing single-object getters or deletes for a few device-DB objects, but core workflows are well covered.

Maintenance

ActivityMaintained
ResponsivenessUsually handled

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to interact with FortiAnalyzer for log analysis, reporting, security monitoring, and SOC operations via the JSON-RPC API.
    16
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides programmatic access to FortiGate devices for managing firewall policies, routing, virtual IPs, and device operations, enabling integration with MCP-compatible clients like Claude Desktop.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to manage FortiGate firewalls from bootstrap to production, with safe preview/apply changes and secure credential handling. Covers inventory, VDOMs, interfaces, routing, firewall policies, VPN, security analysis, and documentation generation.
    MIT