Skip to main content
Glama
ry-ops

fortigate-mcp-server

by ry-ops

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
K8S_CONTEXTNoKubernetes context to use with K8S_KUBECONFIG.
PROXMOX_HOSTNoProxmox VE host; enables the Proxmox tools with PROXMOX_USER, PROXMOX_TOKEN_NAME and PROXMOX_TOKEN_VALUE.
PROXMOX_PORTNoProxmox VE port.
PROXMOX_USERNoProxmox VE user.
FORTIGATE_HOSTYesHostname or IP of the FortiGate.
FORTIGATE_PORTNoHTTPS admin port.443
FORTIGATE_VDOMNoVDOM for every call (tools also take vdom).root
K8S_KUBECONFIGNoKubernetes kubeconfig path; enables the Kubernetes tools.
FORTIGATE_TIMEOUTNoRequest timeout in seconds.30
FORTICLOUD_ACCOUNTNoFortiCloud account, only for activate_vm_eval_license (main FortiCloud account, 2FA off).
FORTIGATE_PASSWORDNoSession login password, used when no token is set (needed on an unlicensed VM).
FORTIGATE_USERNAMENoSession login username, used when no token is set (needed on an unlicensed VM).
PROXMOX_TOKEN_NAMENoProxmox VE token name.
PROXMOX_VERIFY_SSLNoVerify the Proxmox TLS certificate.
FORTICLOUD_PASSWORDNoFortiCloud password, only for activate_vm_eval_license.
FORTIGATE_API_TOKENNoREST API admin token (recommended).
FORTIGATE_READ_ONLYNoRefuse every POST/PUT/DELETE before it reaches the FortiGate.false
PROXMOX_TOKEN_VALUENoProxmox VE token value.
FORTIGATE_VERIFY_SSLNoVerify 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

CapabilityDetails
tools
{
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.1/5.0

Scored across 88 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count1/5

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.

Completeness5/5

Coverage is exceptionally thorough: firewall policies, addresses, services, DNS/DHCP, routing, interfaces, licenses, HA, audits, logs, security profiles, certificates, and a generic REST escape hatch. There are no obvious gaps for managing a FortiGate.

Maintenance

ActivityMaintained
ResponsivenessNo issues