Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Device availability and monitored inventory from Zabbix — is a device reachable, since when, how often has it flapped, and what is the NMS actually watching. Use when someone asks how long a device has been down, whether it is flapping, or what is and is not being monitored.
.claude/skills/automateyournetwork-zabbix-availability/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -15% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 26% | 0% |
zabbix-mcp — vendored third-party, read-only, three tools. See zabbix-metrics-history for the shared cautions.
> ### "Zabbix cannot reach it" is not "the device is down."
An NMS reports what one poller saw, from one vantage point, at one polling interval. That is evidence, not a verdict.
A device can be unreachable from Zabbix and completely healthy: a firewall rule, a management-VRF problem, a dead SNMP daemon on an otherwise forwarding router, or a poller that has simply not tried recently.
Never write "the device is down." Write:
> "Zabbix has been unable to reach rtr-01 since 14:02 UTC. That is the monitoring system's view from its > own vantage point — it is not confirmation the device is down. `pyats` or `multivendor-cli` can check the > device directly."
This is the same discipline globalping-external-checks applies to probes, and it matters more here, because an NMS feels authoritative in a way a probe network does not.
| State | available | Say | |---|---|---| | Reachable | 1 | "Zabbix reached it at \<time>" | | Unreachable | 2 | "Zabbix cannot reach it as of \<time>" — never "it is down" | | Unknown | 0 | "Zabbix has not yet established reachability" — not the same as unreachable | | Not monitored | host absent | "this device is not monitored by Zabbix" — not the same as unreachable, and by far the most common cause of surprise |
jsonczabbix_api("host.get", { "output": ["hostid","host","name","status"], "selectInterfaces": ["interfaceid","ip","dns","port","available","error","errors_from"], "selectTags": "extend" })
Availability without a timestamp is a claim about the present that may be minutes or hours stale. Every answer states when that state was last observed. errors_from gives you when the failure began.
"It has been down for 40 minutes" and "it has bounced nine times in 40 minutes" lead to completely different investigations. Get the transitions, not just the current state — event.get against the unreachability trigger gives you the history.
Report the count of transitions as well as the current state whenever the window contains more than one.
jsonczabbix_api("host.get", {"output":["hostid","host","status"], "selectInterfaces":"extend", "selectParentTemplates":["name"], "selectHostGroups":["name"]}) zabbix_api("hostgroup.get", {"output":"extend"}) zabbix_api("item.get", {"hostids":["<id>"], "output":["itemid","name","key_","value_type","units","history","trends","lastclock"]})
Two rules:
status: 1) is shown as disabled, never omitted. A device nobody is watching is afinding, not an absence — it is usually how a gap in monitoring is discovered.
history, trends). This lets an engineer see how farback a question can be answered before they ask it, which is far better than asking and getting nothing.
An item whose lastclock is empty is monitored but has never returned a value — a broken poll, and a real finding. Do not report it as "no data".
| Want to… | Use | |---|---| | Metric values over time | zabbix-metrics-history | | Problems and alerts | zabbix-problem-review | | Unsolicited traps | snmptrap-mcp — push, not poll | | Flows | ipfix-mcp | | Instrumented metrics | prometheus, grafana | | SaaS monitoring | auvik, thousandeyes, datadog | | Confirm whether a device is actually down | pyats, multivendor-cli, fortinet — go ask the device. This skill only reports what the poller saw | | Add, enable or disable a host | nothing here. Read-only; NMS configuration is out of scope entirely |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 12,335 | 17,284 | +40% | 1 | 1 | 0% | 1,445 | 1,695 | +17% | 0 | 0 | — |
case-02 | fail→fail | 23,450 | 12,945 | -45% | 1 | 1 | 0% | 2,736 | 1,756 | -36% | 0 | 0 | — |
case-03 | fail→pass | 19,050 | 9,978 | -48% | 1 | 1 | 0% | 2,094 | 2,027 | -3% | 0 | 0 | — |
case-04 | fail→pass | 17,688 | 9,341 | -47% | 1 | 1 | 0% | 2,018 | 1,723 | -15% | 0 | 0 | — |
case-05 | fail→pass | 19,805 | 15,882 | -20% | 1 | 1 | 0% | 3,461 | 2,753 | -20% | 0 | 0 | — |
case-06 | pass→pass | 10,845 | 11,104 | +2% | 1 | 1 | 0% | 1,812 | 2,129 | +17% | 0 | 0 | — |
case-07 | pass→pass | 13,105 | 5,212 | -60% | 1 | 1 | 0% | 1,252 | 1,924 | +54% | 0 | 0 | — |
case-08 | pass→pass | 19,099 | 10,158 | -47% | 1 | 1 | 0% | 1,878 | 2,158 | +15% | 0 | 0 | — |
case-09 | pass→pass | 12,001 | 5,261 | -56% | 1 | 1 | 0% | 1,779 | 2,062 | +16% | 0 | 0 | — |
case-10 | fail→pass | 9,725 | 4,765 | -51% | 1 | 1 | 0% | 1,252 | 1,783 | +42% | 0 | 0 | — |
case-11 | fail→pass | 17,714 | 11,855 | -33% | 1 | 1 | 0% | 1,978 | 2,496 | +26% | 0 | 0 | — |
case-12 | fail→pass | 18,176 | 17,624 | -3% | 1 | 1 | 0% | 2,901 | 3,451 | +19% | 0 | 0 | — |
case-13 | pass→pass | 13,117 | 5,848 | -55% | 1 | 1 | 0% | 2,469 | 2,336 | -5% | 0 | 0 | — |
case-14 | fail→pass | 14,699 | 5,808 | -60% | 1 | 1 | 0% | 2,183 | 2,236 | +2% | 0 | 0 | — |
case-15 | fail→pass | 8,265 | 4,953 | -40% | 1 | 1 | 0% | 1,530 | 1,952 | +28% | 0 | 0 | — |
case-16 | fail→pass | 10,223 | 6,086 | -40% | 1 | 1 | 0% | 1,277 | 2,134 | +67% | 0 | 0 | — |
case-17 | pass→pass | 8,852 | 4,949 | -44% | 1 | 1 | 0% | 1,498 | 1,804 | +20% | 0 | 0 | — |
case-18 | fail→pass | 21,481 | 4,767 | -78% | 1 | 1 | 0% | 3,494 | 1,833 | -48% | 0 | 0 | — |
case-19 | fail→pass | 16,721 | 6,964 | -58% | 1 | 1 | 0% | 2,451 | 2,229 | -9% | 0 | 0 | — |
case-20 | pass→pass | 9,633 | 6,137 | -36% | 1 | 1 | 0% | 1,358 | 2,056 | +51% | 0 | 0 | — |
case-21 | fail→fail | 11,197 | 8,007 | -28% | 1 | 1 | 0% | 1,358 | 2,388 | +76% | 0 | 0 | — |
case-22 | pass→pass | 18,986 | 10,689 | -44% | 1 | 1 | 0% | 2,544 | 3,006 | +18% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.