Install any skill in seconds. Free to start, no credit card required.
Get Started Free →FortiGate device operations — system status, interfaces, routing, IPsec VPN tunnel state with phase 1 and phase 2 reported separately, HA member identification, per-VDOM scoping, and manager-vs-device drift detection. Use when asking what a FortiGate is ACTUALLY doing right now, whether a tunnel is up, or whether the device matches FortiManager's intent.
.claude/skills/automateyournetwork-fortigate-ops/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -7% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 12% | 0% |
fortinet-mcp (NetClaw-authored, spec 080 / roadmap R3)$FORTINET_MCP_CMDFORTIGATE_HOST, FORTIGATE_API_TOKENA FortiGate knows what it is doing. It does not know what it was supposed to do.
| Question | Plane | Skill | |---|---|---| | "Is the tunnel up? What's in the routing table?" | device | this skill | | "What policy is intended across the estate?" | manager | fortimanager-ops | | "Has anything ever matched this rule?" | analyzer | fortianalyzer-ops | | "Run a raw FortiOS CLI command" | CLI | multivendor-raw-cli (spec 076) |
If a device does not answer, this skill reports that it did not answer. It never substitutes FortiManager's intended configuration as though it were observed state — that would turn "the box is unreachable" into a confident, wrong description of a box nobody can see.
| Tool | What it answers | |---|---| | fgt_system_status | Hostname, serial, version, HA mode, which member answered | | fgt_list_interfaces | Interfaces: link, addressing, speed, error counters, per VDOM | | fgt_get_routes | Routing table as observed, optional protocol filter | | fgt_vpn_tunnels | IPsec tunnels — phase 1 and phase 2 separately | | fgt_get_policies | Firewall policy as running on the device | | fgt_compare_with_manager | Divergence between intent and observed state |
This is the single most important behaviour here.
A tunnel with phase 1 up and phase 2 down is neither "up" nor "down". It is a specific and common fault — usually a proxy-ID or selector mismatch — where IKE negotiated fine and no traffic can actually pass. Collapsing the two into one status field destroys the only signal that distinguishes it from a healthy tunnel or a dead one.
fgt_vpn_tunnels therefore returns phase1_status, phase2_status, and phase2_selectors[] per selector pair, because one down selector out of five is still a fault worth naming.
jsonc{ "plane": "device", "scope": {"device": "FGVMEVS9GWUAOMBD", "vdom": "root"}, "source": "...", "outcome": "ok", "data": {...}, "notes": [] }
Scope is mandatory. A figure without its VDOM is ambiguous on a multi-VDOM unit, so a response that cannot name its scope is returned as an error rather than as an unqualified result.
fgt_vpn_tunnels — read both phases.fgt_get_routes for a pathto the remote gateway.
phase2_selectors[] for which pair failed.
(fgt_get_policies) or to the analyzer plane for whether anything matched.
fgt_compare_with_manager with the ADOM and package.only_in_device → rules on the box that are absent from the policy package.Someone changed the firewall directly. This is the highest-value finding this skill produces and it is invisible from either plane alone.
only_in_manager → package not installed since those rules were added.that failed. A half-comparison would be worse than none.
A FortiGate-VM evaluation licence caps the unit at 1 vCPU, 2 GB RAM, 3 interfaces, 3 routes and 3 firewall policies. A small ruleset on such a device is a lab limit, not the estate's real posture — fgt_get_policies says so in its notes.
An unlicensed FortiGate refuses REST authentication entirely: every request returns 401 regardless of token validity, trusthost, or admin profile. If every call fails with auth_expired, check get system status for License Status: Valid before suspecting the token.
| Skill | How they compose | |---|---| | fortimanager-ops | The intent this device is measured against | | fortianalyzer-ops | Whether traffic actually matched what is configured here | | fwrule-analyzer | Feed fgt_get_policies output to its FortiOS parser | | multivendor-raw-cli | Raw CLI (spec 076). Use when you need command output, not structure | | pyats-troubleshoot | Correlate firewall path findings with routing/device state elsewhere | | gait-session-tracking | Every operation here is GAIT-audited automatically |
fortimanager-ops and its two gates.
Other measured skills in the registry, with their headline benchmark lift.