fortigate-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| K8S_CONTEXT | No | Kubernetes context to use with K8S_KUBECONFIG. | |
| PROXMOX_HOST | No | Proxmox VE host; enables the Proxmox tools with PROXMOX_USER, PROXMOX_TOKEN_NAME and PROXMOX_TOKEN_VALUE. | |
| PROXMOX_PORT | No | Proxmox VE port. | |
| PROXMOX_USER | No | Proxmox VE user. | |
| FORTIGATE_HOST | Yes | Hostname or IP of the FortiGate. | |
| FORTIGATE_PORT | No | HTTPS admin port. | 443 |
| FORTIGATE_VDOM | No | VDOM for every call (tools also take vdom). | root |
| K8S_KUBECONFIG | No | Kubernetes kubeconfig path; enables the Kubernetes tools. | |
| FORTIGATE_TIMEOUT | No | Request timeout in seconds. | 30 |
| FORTICLOUD_ACCOUNT | No | FortiCloud account, only for activate_vm_eval_license (main FortiCloud account, 2FA off). | |
| FORTIGATE_PASSWORD | No | Session login password, used when no token is set (needed on an unlicensed VM). | |
| FORTIGATE_USERNAME | No | Session login username, used when no token is set (needed on an unlicensed VM). | |
| PROXMOX_TOKEN_NAME | No | Proxmox VE token name. | |
| PROXMOX_VERIFY_SSL | No | Verify the Proxmox TLS certificate. | |
| FORTICLOUD_PASSWORD | No | FortiCloud password, only for activate_vm_eval_license. | |
| FORTIGATE_API_TOKEN | No | REST API admin token (recommended). | |
| FORTIGATE_READ_ONLY | No | Refuse every POST/PUT/DELETE before it reaches the FortiGate. | false |
| PROXMOX_TOKEN_VALUE | No | Proxmox VE token value. | |
| FORTIGATE_VERIFY_SSL | No | Verify the TLS certificate. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_system_statusC | FortiGate model, serial, firmware version/build, hostname and uptime. |
| get_license_statusA | License and FortiGuard contract status. By default returns only the VM license, FortiCare and FortiGuard sections; set all=true for every entitlement. An unlicensed FortiGate-VM reports vm.status=vm_invalid and refuses most other API calls with 401. |
| get_license_limitsB | How much of the license's object limits is used. The free FortiGate-VM evaluation license allows 1 vCPU, 2 GB RAM and at most 3 interfaces, 3 firewall policies and 3 static routes; this lists what counts against each so you can plan before hitting one. |
| get_license_featuresA | What this FortiGate is licensed for: free evaluation VM, licensed VM or hardware; whether it reaches FortiGuard; which FortiGuard services (IPS, antivirus, web filter, application control, Internet Service Database, FortiCloud logging...) are licensed, not licensed or expiring within 30 days; and the version and age of each signature database. Tools that need a FortiGuard service check this and say so when it's missing. |
| get_resource_usageC | Current CPU, memory, disk and session usage. |
| list_interfacesB | List interface configuration (IP, mode, role, alias, allowaccess). |
| get_interfaceC | Get one interface's full configuration. |
| get_interface_statusB | Live interface state: link, speed, IP and traffic counters. |
| update_interfaceA | Update an interface. Changing the interface this server connects through (its IP, mode or allowaccess) can cut off API access, so double-check those changes. |
| list_admin_sessionsC | Administrators currently logged in (GUI, SSH, API) and where from. |
| audit_admin_accessA | Read-only audit of how the FortiGate can be administered: admins without trusted hosts or MFA, the default 'admin' account, API keys, HTTPS/SSH/HTTP/telnet admin access on WAN interfaces, local-in policies, and admin passwords still stored as legacy SHA-256 instead of PBKDF2. Returns findings graded critical/warn/info, each with a suggested fix. The hash check reads a config backup, which the FortiGate logs as a config download; set check_hashes=false to skip it. |
| audit_hardeningA | Read-only hardening audit: everything audit_admin_access checks, plus admin access on LAN interfaces, local-in coverage, telnet, FortiCloud SSO, crypto and TLS settings, SSL VPN, logging (implicit deny, local-in denies, remote targets, cleartext syslog), password policy, NTP, FortiGuard updates and stale signatures, whether accept policies are protected by security profiles, and HA heartbeat hardening. Each finding carries the order to fix it in and whether the fix can cut off admin access, and fix_plan lists them in that order. On the evaluation license it lists the FortiGuard features that don't apply and what to rely on instead. check_hashes reads a config backup, as in audit_admin_access. |
| backup_configA | Back up the full running configuration (FortiOS CLI text) to a local file and return its path and size. Allowed in read-only mode. Configs are hundreds of KB, so the text itself is not returned. |
| forticonverter_setup_promptA | Show or hide the 'Migrate Config with FortiConverter' step of the GUI's FortiGate Setup popup. Without hide, only reports the current state. FortiGate-VM evaluation licenses are not eligible for FortiConverter, so that step never completes and the popup reappears at every login until it is hidden. There is no CLI equivalent. |
| activate_vm_eval_licenseA | Activate the free permanent evaluation license on an unlicensed FortiGate-VM by logging in to FortiCloud from the FortiGate (the same call the GUI makes). The FortiCloud account comes from the FORTICLOUD_ACCOUNT and FORTICLOUD_PASSWORD environment variables, never from tool arguments. The FortiGate reboots to apply it. Unlicensed VMs refuse most API calls, so use session auth (FORTIGATE_USERNAME/PASSWORD) on a fresh VM. FortiCare error 10 means wrong credentials, an IAM sub-user, or 2FA on the account. |
| get_ha_statusA | High availability: the mode (standalone, active-passive, active-active), group, heartbeat interfaces and monitored interfaces, each cluster member with its role, priority and uptime, and whether members' configurations are in sync. Flags out-of-sync members, unencrypted or unauthenticated heartbeats, a single heartbeat interface and no session pickup. |
| list_fortitokensA | FortiTokens on the FortiGate (serial, status, license) and which administrators use two-factor authentication, by which method and token. Tokens are activated through FortiGuard, so the evaluation license has none. |
| set_admin_mfaA | Turn on two-factor authentication for an administrator: fortitoken (needs an activated token serial), email (needs email_to and a working email server) or sms (needs sms_phone and SMS service); or disable it. Checks the prerequisites first. dry_run (the default) shows the change. Test a login in a private window before closing your current session. |
| get_fortiguard_statusA | Whether FortiGuard updates are actually reaching this FortiGate: connection state, each FortiGuard server's reachability and packet loss, the update schedule, which services are licensed, and how old each signature database is. Adds findings for failing servers, stale signatures on licensed services and a disabled update schedule. On the free evaluation license it says that FortiGuard is unavailable by design. |
| update_fortiguardA | Ask the FortiGate to contact FortiGuard now and refresh its entitlements and signature packages (the GUI's 'Check update now'). Needs a FortiGuard license. With dry_run (the default) it only reports what would happen and the current signature ages. |
| get_firmware_statusA | Running firmware (version, build, maturity, release notes), newer images FortiGuard offers, the supported upgrade path, and the automatic firmware upgrade settings. Images and upgrade paths come from FortiGuard, so the evaluation license lists none; check https://www.fortiguard.com/psirt for the running release by hand there. |
| list_firewall_policiesC | List IPv4 firewall policies in evaluation order. |
| get_firewall_policyC | Get one firewall policy. |
| create_firewall_policyA | Create a firewall policy. New policies are added at the end of the list; use move_firewall_policy to reorder. FortiGate-VM evaluation licenses allow only 3 policies. |
| update_firewall_policyA | Update a firewall policy. Only the fields given change; list fields are replaced, not appended. |
| delete_firewall_policyC | Delete a firewall policy. |
| move_firewall_policyB | Move a policy before or after another one (policies match top-down). |
| get_policy_statsC | Hit counts, bytes, packets and last-used time per policy. |
| list_sessionsA | Current sessions through the firewall, optionally filtered, with the matched and total session counts. Sessions to the FortiGate itself (admin GUI/API) may be counted but not listed. |
| list_addressesC | List firewall address objects. |
| get_addressC | Get one firewall address object. |
| create_addressC | Create a firewall address: a subnet/host, an IP range, or an FQDN. |
| update_addressC | Update a firewall address object. |
| delete_addressA | Delete a firewall address (fails while a policy or group still uses it). |
| list_address_groupsB | List firewall address groups and their members. |
| create_address_groupC | Create an address group. |
| update_address_groupB | Update an address group. members replaces the whole member list. |
| delete_address_groupA | Delete an address group (fails while a policy still uses it). |
| list_servicesC | List custom firewall services (port definitions). |
| create_serviceC | Create a custom TCP/UDP service. |
| list_service_groupsC | List service groups and their members. |
| create_service_groupA | Create a service group, e.g. K3S-MGMT = [SSH, K8S-API, PING]. Grouping services lets one policy cover what would otherwise need several, which helps under the evaluation license's 3-policy limit. |
| update_service_groupB | Update a service group. members replaces the whole member list. |
| delete_service_groupA | Delete a service group (fails while a policy still uses it). |
| delete_serviceA | Delete a custom service (fails while a policy still uses it). |
| list_port_forwardsB | List virtual IPs (port forwards / static NAT) and the policies that use each one. |
| create_port_forwardA | Create a port forward (VIP): traffic arriving on extintf at extip:extport goes to mappedip:mappedport. A VIP only passes traffic once a policy from extintf uses it as a destination. With attach_to_policy, the VIP is added to that existing policy's destinations instead of needing a new policy (the evaluation license allows only 3). FortiOS does not allow VIPs and ordinary addresses in the same policy's destinations, so the target must already use only VIPs, or pass replace_destinations=true to turn it into a VIP-only policy (its old destinations stop being reachable through it). In that policy, services match the mapped (internal) port. |
| delete_port_forwardA | Delete a VIP. FortiOS refuses while a policy uses it; detach=true first removes it from every policy's destinations. A policy whose only destination is this VIP blocks the delete: change or delete that policy first. |
| search_applicationsA | Search application-control signatures by name (contains, case-insensitive) and/or category, e.g. query=YouTube or category=P2P. Returns id, name, category and risk. |
| list_app_categoriesB | Application-control categories (id and name), e.g. P2P, Proxy, Game, Video/Audio. |
| list_app_control_profilesB | App-control profiles with their rules, showing application and category names instead of ids. |
| add_app_control_ruleA | Add a rule to an app-control profile matching applications and/or categories by name (or id). Rules are checked top-down and the built-in profiles start with a catch-all pass rule, so new rules are inserted at the top by default (position=bottom to append). Only affects policies whose application_list is this profile. |
| delete_app_control_ruleB | Remove a rule from an app-control profile by its id (see list_app_control_profiles). |
| list_security_profilesA | Security profiles by kind (ips, antivirus, webfilter, dnsfilter, application, emailfilter, dlp, file-filter, waf, videofilter, ssh-filter, virtual-patch), each with the firewall policies that use it, and whether the FortiGuard service behind the kind is licensed (and what the profile can still do if not). Read or change a profile's settings with get_config / set_config on the endpoint shown. |
| audit_policy_protectionA | Check that accept policies are actually protected: traffic from or to a WAN interface with no IPS sensor, profiles attached while security profiles are disabled on the policy, antivirus/DLP/file filter with an inspection profile that can't see inside HTTPS, profiles whose FortiGuard service isn't licensed, and policies that don't log. Read-only. |
| list_ssl_ssh_profilesA | List SSL/SSH inspection profiles with the CA each one re-signs with. The built-in no-inspection, certificate-inspection and deep-inspection profiles are read-only; edit custom-deep-inspection or a copy instead. |
| update_ssl_ssh_profileB | Update an SSL/SSH inspection profile, e.g. the CA used to re-sign certificates during deep inspection. Clients must trust that CA, and FortiGate-VM evaluation licenses re-sign RSA sites with 512-bit keys regardless of the CA, which modern clients reject. |
| list_certificatesA | List local and CA certificates with key type and size, validity and usage flags. Certificates with RSA keys under 2048 bits are flagged weak: FortiGate-VM evaluation licenses generate 512-bit factory certificates. Bundled public CAs are omitted unless include_bundle is true. |
| download_certificateA | Download a certificate's PEM (public part only), e.g. the deep-inspection CA Fortinet_CA_SSL so clients can be told to trust it. Returns the PEM and its SHA-256 fingerprint. |
| get_top_trafficA | Live FortiView summary of the sessions passing through right now, grouped by source, destination, application, country, interface, policy or protocol. Destinations include the resolved hostname; application IDs are translated to names. Empty when nothing is flowing (it reflects current sessions, not history). |
| get_arp_tableB | IPv4 ARP table: which MAC answers for which IP on each interface. |
| get_logsA | Read FortiGate logs, newest first. Useful types: traffic/forward (sessions through policies, with app identification), app-ctrl (per-connection application and, with certificate inspection, the HTTPS hostname), event/system (admin and config events), ips, webfilter. FortiGate-VMs without a log disk only keep logs in memory, which is lost on reboot. |
| get_log_targetsB | Where logs go: each syslog server (up to 4), FortiAnalyzer (up to 3), FortiGuard Cloud, local disk and memory, with transport and encryption. Flags logs that only live in memory (lost on reboot), syslog sent as cleartext UDP, and FortiAnalyzer without certificate verification. |
| set_syslog_targetA | Send logs to a syslog server: sets server, port and transport on one of the four syslog slots and enables it. mode is udp (default), reliable (TCP) or legacy-reliable; with reliable, enc_algorithm (high, high-medium, low) adds TLS. Validated against the FortiGate's schema; dry_run (the default) shows the change without sending it. |
| get_routing_tableB | Active IPv4 routing table (connected, static, DHCP-learned and dynamic routes). |
| list_static_routesC | List configured static routes. |
| create_static_routeB | Add a static route. FortiGate-VM evaluation licenses allow only 3 routes. |
| delete_static_routeA | Delete a static route by its sequence number (seq-num from list_static_routes). |
| get_dns_settingsC | System DNS settings: upstream resolvers the FortiGate itself uses and forwards to. |
| list_dns_serversC | Interfaces where the FortiGate answers DNS queries, and in which mode. |
| set_dns_serverA | Serve DNS on an interface. Modes: recursive (local zones first, then forward to the system resolvers), non-recursive (local zones only), forward-only. |
| delete_dns_serverC | Stop serving DNS on an interface. |
| list_dns_zonesB | List local DNS zones (dns-database) with their records. |
| create_dns_zoneB | Create a local DNS zone. view=shadow serves internal clients. FortiOS does not accept wildcard (*) hostnames, so add one record per name. |
| delete_dns_zoneB | Delete a local DNS zone and all its records. |
| add_dns_recordB | Add a record to a local DNS zone. Wildcard (*) hostnames are rejected by FortiOS. |
| delete_dns_recordB | Delete a record from a local DNS zone by its id (see list_dns_zones). |
| list_dhcp_serversB | List DHCP servers with their ranges, options and reservations. |
| list_dhcp_leasesC | Current DHCP leases handed out by the FortiGate. |
| update_dhcp_serverB | Update a DHCP server. Note: vci_match=true makes the server answer only clients whose vendor class matches vci-string (FortiOS defaults to FortiSwitch/FortiExtender), which silently ignores ordinary clients. |
| add_dhcp_reservationA | Reserve an IP for a MAC address on a DHCP server (the IP may sit outside the pool). |
| delete_dhcp_reservationC | Remove a DHCP reservation by its id (see list_dhcp_servers). |
| search_apiA | Find FortiOS API endpoints by keyword, from the FortiGate's own schema: configuration (cmdb, e.g. 'bgp' -> router/bgp) and live state (monitor, e.g. 'ha peer' -> system/ha-peer). Use it to reach any setting no dedicated tool covers, then describe_config, get_config, set_config or get_monitor. |
| describe_configA | Describe a configuration endpoint from the FortiGate's schema: whether it is a table (many entries, keyed by mkey) or a single settings object, and each field's type, allowed values, range and default. Pass field for one field in full, including the sub-fields of a nested table. |
| get_configA | Read any configuration endpoint: a whole settings object, every entry of a table, or one entry by mkey. Password and key fields are shown as '', never their values. |
| set_configA | Change any configuration endpoint, validated against the FortiGate's schema first: field names, option values, integer ranges, string lengths, and table vs single-object rules. action is update (default), create or delete. With dry_run (the default) nothing is sent; the result shows the request and each field's current and new value. Fields that reference other objects take a list of names, e.g. srcaddr: ['LAB-NET']. |
| get_monitorA | Read any monitor (live state) endpoint, e.g. system/ha-peer, router/ipv4, vpn/ipsec, user/firewall. Only endpoints FortiOS serves with GET are allowed: monitor POST endpoints act on the device (reboots, disconnects, updates), so they stay in the dedicated tools or fortigate_api. |
| fortigate_apiA | Call any FortiOS REST endpoint directly. path must start with /api/v2/ (cmdb/... for configuration, monitor/... for live state). FORTIGATE_READ_ONLY still applies. Prefer the dedicated tools when one exists. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 88 tools
Most tools target distinct resources and actions (e.g., list_addresses vs create_address_group vs list_firewall_policies), and descriptions clarify boundaries. Some overlap exists between the generic API tools (get_config/set_config/fortigate_api) and dedicated update/create tools, and audit_admin_access overlaps with audit_hardening, but descriptions generally resolve which to use.
The set predominantly follows a consistent verb_noun snake_case pattern (list_, get_, create_, update_, delete_, audit_, set_). A couple of tools break the pattern (forticonverter_setup_prompt and fortigate_api are noun phrases), but overall naming is predictable and readable.
88 tools is far beyond the typical 3-15 range and qualifies as an extreme mismatch. The presence of generic config tools (search_api, get_config, set_config, fortigate_api) makes many dedicated tools redundant, bloating the surface and increasing selection cost.
Coverage is exceptionally thorough: firewall policies, addresses, services, DNS/DHCP, routing, interfaces, licenses, HA, audits, logs, security profiles, certificates, and a generic REST escape hatch. There are no obvious gaps for managing a FortiGate.