Install any skill in seconds. Free to start, no credit card required.
Get Started Free →F5 BIG-IP health monitoring - virtual server status, pool member health, log analysis, performance statistics, and systematic health assessment. Use when checking F5 load balancer health, running a pre-change or post-change validation, investigating pool member failures, or auditing SSL certificate expiration.
.claude/skills/automateyournetwork-f5-health-check/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 157% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 199% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 187% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 133% | 0% |
The F5 MCP server provides 6 tools. Call them via mcp-call with the required environment variables:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" <tool_name> '{"param":"value"}'
| Tool | Purpose | Key Arguments | |------|---------|---------------| | list_tool | List F5 objects by type | object_name, object_type (virtual/pool/irule/profile) | | show_stats_tool | Show statistics for an F5 object | object_name, object_type (virtual/pool/irule/profile) | | show_logs_tool | Show N lines of system logs | lines_number | | create_tool | Create an F5 object via POST | url_body, object_type | | update_tool | Update an F5 object via PATCH | url_body, object_type, object_name | | delete_tool | Delete an F5 object | object_type, object_name |
Always run health checks in this exact order. Each section builds on the previous one.
List all virtual servers to establish the baseline inventory.
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" list_tool '{"object_name":"","object_type":"virtual"}'
Extract and report:
Flags:
offline -> CRITICAL: VIP not serving trafficunknown -> WARNING: Cannot determine healthdisabled -> INFO: Intentionally taken out of service (verify with change records)For each virtual server discovered in Step 1, collect detailed statistics:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" show_stats_tool '{"object_name":"my_virtual_server","object_type":"virtual"}'
Key metrics to evaluate:
| Metric | HEALTHY | WARNING | CRITICAL | |--------|---------|---------|----------| | Status availability | available | unknown | offline | | Current connections | < 80% of connection limit | 80-95% of limit | > 95% of limit or at limit | | Packets in/out | Non-zero, balanced ratio | Highly asymmetric (>100:1) | Zero in either direction | | Bits in/out | Non-zero | Sudden drop >50% from baseline | Zero (no traffic flowing) | | Total requests (HTTP VIPs) | Incrementing | Flat (stalled) | Decreasing or zero | | Client-side connection rate | Steady or growing | Spike >200% baseline | Zero |
Thresholds:
List all pools and their members:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" list_tool '{"object_name":"","object_type":"pool"}'
Extract and report for each pool:
Flags:
offline -> CRITICAL: Pool is down, no healthy backendsoffline -> WARNING: Reduced capacityoffline -> HIGH: Significant capacity degradationdisabled but not offline -> INFO: Intentionally drained (verify with change records)For each pool, collect statistics to assess utilization:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" show_stats_tool '{"object_name":"my_pool","object_type":"pool"}'
Key metrics to evaluate:
| Metric | HEALTHY | WARNING | CRITICAL | |--------|---------|---------|----------| | Active member count | All members active | < 75% active | < 50% active or zero | | Current connections per member | Evenly distributed | Skewed >3:1 ratio | Single member handling all traffic | | Server-side connections | Incrementing | Flat | Zero | | Total requests served | Incrementing | Flat | Decreasing | | Bytes in/out | Balanced | Asymmetric | Zero |
Connection distribution analysis:
List all profiles to document the configuration posture:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" list_tool '{"object_name":"","object_type":"profile"}'
Check for:
Flags:
List all iRules to document traffic manipulation logic:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" list_tool '{"object_name":"","object_type":"irule"}'
Check for:
Flags:
log statements in high-traffic path -> WARNING: Performance impactHTTP::collect without HTTP::release -> CRITICAL: Memory leak riskcatch blocks -> INFO: Error handling present (good practice)Pull recent system logs to detect errors and anomalies:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" show_logs_tool '{"lines_number":"200"}'
Scan for these critical patterns:
| Pattern | Severity | Meaning | |---------|----------|---------| | 01010028 | CRITICAL | No members available for pool | | 01010029 | CRITICAL | Pool member monitor status down | | 0107142f | CRITICAL | SSL handshake failure | | 01070417 | CRITICAL | HTTP parse error | | 01060102 | HIGH | Connection rate limit reached | | 01010025 | HIGH | Virtual server connection limit reached | | 01071681 | WARNING | Pool member has been marked down | | 01071682 | INFO | Pool member has been marked up | | 01010240 | WARNING | Connection queue full | | 0107143c | WARNING | SSL certificate verification failure | | 01070727 | WARNING | Pool member rate limit reached | | MCP error | HIGH | Management plane communication issue | | disk_usage | WARNING | Disk space issue on BIG-IP | | memory | HIGH | Memory pressure on BIG-IP | | ha_status | CRITICAL | High availability state change | | failover | CRITICAL | HA failover event detected |
Log analysis guidelines:
If Step 7 reveals errors, pull more log lines for deeper analysis:
bashIP_ADDRESS=$F5_IP_ADDRESS Authorization_string=$F5_AUTH_STRING python3 $MCP_CALL "python3 -u $F5_MCP_SCRIPT" show_logs_tool '{"lines_number":"1000"}'
Advanced log analysis:
Always produce a summary table after completing all steps:
F5 BIG-IP Health Report
Device: $F5_IP_ADDRESS
Date: YYYY-MM-DD HH:MM UTC
+---------------------------+----------+------------------------------------------+
| Check | Status | Details |
+---------------------------+----------+------------------------------------------+
| Virtual Servers | HEALTHY | 5/5 available, all serving traffic |
| Pool Health | WARNING | pool_web: 3/4 members active (node3 dn) |
| Connection Utilization | HEALTHY | Peak VIP at 45% connection limit |
| Traffic Distribution | HEALTHY | Even distribution across pool members |
| SSL/TLS Profiles | WARNING | www_ssl cert expires in 21 days |
| iRules | HEALTHY | 3 active, no problematic patterns |
| System Logs | HIGH | 47x 01010029 (monitor down) in last hour |
+---------------------------+----------+------------------------------------------+
Overall: WARNING -- 2 items need attention
Action Items:
1. [WARNING] Investigate pool_web node3 health check failures
2. [WARNING] Renew SSL certificate for www_ssl profile (expires in 21 days)
3. [HIGH] Investigate spike in pool member monitor-down log messagesSeverity order: CRITICAL > HIGH > WARNING > HEALTHY. Overall status = worst individual status.
When monitoring multiple F5 appliances, run the full procedure on each device and produce a fleet summary:
+------------------+----------+----------+--------+--------+-----------+
| BIG-IP | Virtuals | Pools | SSL | Logs | Overall |
+------------------+----------+----------+--------+--------+-----------+
| bigip-prod-01 | HEALTHY | WARNING | HEALTHY| HEALTHY| WARNING |
| bigip-prod-02 | HEALTHY | HEALTHY | WARN | HIGH | HIGH |
| bigip-dr-01 | HEALTHY | HEALTHY | HEALTHY| HEALTHY| HEALTHY |
+------------------+----------+----------+--------+--------+-----------+Sort devices by severity (CRITICAL first) for triage prioritization.
After completing a health check, record the session in GAIT:
bashpython3 $MCP_CALL "python3 -u $GAIT_MCP_SCRIPT" gait_record_turn '{"prompt":"F5 BIG-IP health check on $F5_IP_ADDRESS","response":"Health check completed. Virtual servers: 5/5 HEALTHY. Pools: WARNING (pool_web 3/4 members). SSL: WARNING (cert expires 21 days). Logs: HIGH (47x monitor-down events). Overall: WARNING. Action items: investigate pool_web node3, renew SSL cert, investigate log spike.","artifacts":["f5-health-report.txt"]}'
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 21,902 | 10,840 | -51% | 1 | 1 | 0% | 3,836 | 4,886 | +27% | 0 | 0 | — |
case-15 | pass→pass | 23,934 | 21,027 | -12% | 1 | 1 | 0% | 552 | 3,948 | +615% | 0 | 0 | — |
case-02 | fail→fail | 18,454 | 5,726 | -69% | 1 | 1 | 0% | 3,048 | 3,975 | +30% | 0 | 0 | — |
case-03 | fail→pass | 31,210 | 21,936 | -30% | 1 | 1 | 0% | 5,687 | 8,072 | +42% | 0 | 0 | — |
case-04 | pass→pass | 5,704 | 3,300 | -42% | 1 | 1 | 0% | 1,010 | 4,089 | +305% | 0 | 0 | — |
case-05 | pass→pass | 6,832 | 2,708 | -60% | 1 | 1 | 0% | 1,299 | 4,008 | +209% | 0 | 0 | — |
case-06 | pass→pass | 7,129 | 1,844 | -74% | 1 | 1 | 0% | 1,299 | 3,854 | +197% | 0 | 0 | — |
case-07 | pass→pass | 7,050 | 5,352 | -24% | 1 | 1 | 0% | 1,243 | 4,496 | +262% | 0 | 0 | — |
case-08 | fail→pass | 10,791 | 6,202 | -43% | 1 | 1 | 0% | 1,787 | 4,584 | +157% | 0 | 0 | — |
case-09 | fail→pass | 9,551 | 6,770 | -29% | 1 | 1 | 0% | 1,584 | 4,730 | +199% | 0 | 0 | — |
case-10 | fail→pass | 9,153 | 4,060 | -56% | 1 | 1 | 0% | 1,482 | 4,260 | +187% | 0 | 0 | — |
case-11 | pass→pass | 11,694 | 9,340 | -20% | 1 | 1 | 0% | 2,143 | 4,313 | +101% | 0 | 0 | — |
case-12 | fail→pass | 10,902 | 18,322 | +68% | 1 | 1 | 0% | 1,814 | 4,222 | +133% | 0 | 0 | — |
case-13 | pass→pass | 14,796 | 13,787 | -7% | 1 | 1 | 0% | 1,414 | 3,979 | +181% | 0 | 0 | — |
case-14 | pass→pass | 8,974 | 4,637 | -48% | 1 | 1 | 0% | 1,295 | 4,299 | +232% | 0 | 0 | — |
case-16 | fail→pass | 15,445 | 10,013 | -35% | 1 | 1 | 0% | 2,006 | 5,038 | +151% | 0 | 0 | — |
case-17 | fail→pass | 12,843 | 17,184 | +34% | 1 | 1 | 0% | 1,525 | 4,739 | +211% | 0 | 0 | — |
case-18 | fail→pass | 11,291 | 4,845 | -57% | 1 | 1 | 0% | 1,865 | 4,412 | +137% | 0 | 0 | — |
case-19 | fail→pass | 6,628 | 2,647 | -60% | 1 | 1 | 0% | 1,172 | 3,961 | +238% | 0 | 0 | — |
case-20 | fail→fail | 5,104 | 6,597 | +29% | 1 | 1 | 0% | 991 | 4,868 | +391% | 0 | 0 | — |
case-21 | fail→fail | 13,754 | 16,888 | +23% | 1 | 1 | 0% | 2,627 | 6,423 | +144% | 0 | 0 | — |
case-22 | fail→fail | 10,473 | 11,608 | +11% | 1 | 1 | 0% | 2,083 | 5,702 | +174% | 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 21 counted toward the lift figure. The other 1 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 +41 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is 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.