Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Comprehensive Cisco ACI fabric health audit - node status, tenant/VRF/BD/EPG policy review, contract analysis, fault triage, and endpoint learning verification. Use when auditing ACI fabric health, checking for faults, reviewing tenant policies, or running pre/post-change baselines on APIC.
.claude/skills/automateyournetwork-aci-fabric-audit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 176% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 283% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 112% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 150% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 81% | 0% |
All ACI tool calls use mcp-call with environment variables set as a prefix:
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" TOOL_NAME '{"param":"value"}'
Always run the audit in this exact order. Each phase builds on the previous one.
Verify all leaf and spine switches are registered, healthy, and running expected firmware.
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fabric_nodes '{}'
Extract and report:
Flags:
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fabric_pods '{}'
Verify all pods are healthy and reachable.
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fabric_links '{}'
Flags:
Systematically walk the ACI policy tree from tenant down to EPG.
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" tenants_get '{}'
Record the full tenant list. Flag any unexpected tenants (not in the approved tenant registry).
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fvCtx_get '{}'
Flags:
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fvBD_get '{}'
Flags:
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fvAp_get '{}'
Enumerate application profiles to understand the logical grouping of EPGs.
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" fvAEPg_get '{}'
Flags:
Audit contracts for security hygiene -- look for overly permissive rules and unused contracts.
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" contracts_get '{}'
Flags:
For each contract returned, inspect the subjects and filters. Look for:
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" faults '{}'
Categorize and count by severity:
| Severity | Action | |----------|--------| | critical | Immediate triage required | | major | Schedule remediation within 24 hours | | minor | Review in next maintenance window | | warning | Informational, track trending |
Flags:
bashAPIC_URL=$APIC_URL USERNAME=$ACI_USERNAME PASSWORD=$ACI_PASSWORD python3 $MCP_CALL "python3 -u $ACI_MCP_SCRIPT" health '{}'
Thresholds:
Verify that endpoints are being learned correctly across the fabric.
Look for:
Always produce a consolidated summary:
ACI Fabric Audit Report
========================
APIC: $APIC_URL
Timestamp: YYYY-MM-DD HH:MM UTC
Fabric Summary
--------------
Pods: 1 | Nodes: 6 (2 spine, 4 leaf) | All nodes available: YES
Firmware: 6.0(3e) uniform across all nodes
Policy Summary
--------------
Tenants: 5 | VRFs: 8 | BDs: 23 | App Profiles: 12 | EPGs: 47
+--------------------+----------+----------------------------------+
| Check | Status | Details |
+--------------------+----------+----------------------------------+
| Fabric Nodes | HEALTHY | 6/6 nodes available |
| Fabric Links | HEALTHY | All inter-switch links up |
| Tenant Policy | WARNING | 2 EPGs with no contracts |
| VRF Enforcement | HEALTHY | All VRFs enforced |
| Bridge Domains | WARNING | 1 BD with no subnet |
| Contracts | CRITICAL | 1 any-to-any contract found |
| Faults (Critical) | HEALTHY | 0 critical faults |
| Faults (Major) | WARNING | 3 major faults (unacknowledged) |
| Health Score | HEALTHY | 97/100 |
| Endpoint Learning | HEALTHY | No duplicate MACs detected |
+--------------------+----------+----------------------------------+
Overall: WARNING -- 4 items need attention, 1 CRITICAL contract issue
Critical Findings
-----------------
1. [CRITICAL] Contract "default" in tenant "prod" permits all traffic
- Scope: global | Subject filter: implicit-allow
- Recommendation: Replace with explicit per-port filters
2. [WARNING] EPG "web-servers" in tenant "prod" has no provider contracts
- No inbound communication path defined
- Recommendation: Attach appropriate provider contract
3. [WARNING] BD "legacy-bd" has no subnet configured
- L2-only mode, verify this is intentional
...Severity order: CRITICAL > HIGH > WARNING > HEALTHY. Overall status = worst individual status.
After completing the audit, record the session in GAIT:
bashpython3 $MCP_CALL "python3 -u $GAIT_MCP_SCRIPT" gait_record_turn '{"input":{"role":"assistant","content":"ACI fabric audit completed on APIC $APIC_URL: Nodes HEALTHY (6/6), Policy WARNING (2 EPGs no contracts), Contracts CRITICAL (1 any-to-any), Faults WARNING (3 major), Health 97/100. Overall: WARNING.","artifacts":[]}}'
Generate an interactive mind map of the tenant hierarchy:
bashpython3 $MCP_CALL "node $MARKMAP_MCP_SCRIPT" markmap_generate '{"markdown_content":"# ACI Fabric\n## Tenant: prod\n### VRF: prod-vrf\n#### BD: web-bd\n##### EPG: web-servers\n##### EPG: app-servers\n#### BD: db-bd\n##### EPG: db-servers\n## Tenant: shared\n### VRF: shared-l3out\n#### BD: external-bd"}'
Generate a visual fabric topology diagram:
bashpython3 $MCP_CALL "npx -y @drawio/mcp" open_drawio_mermaid '{"content":"graph TD\n subgraph \"Pod 1\"\n APIC1[\"APIC-1\"]\n S1[\"Spine-1\"]\n S2[\"Spine-2\"]\n L1[\"Leaf-1\"]\n L2[\"Leaf-2\"]\n L3[\"Leaf-3\"]\n L4[\"Leaf-4\"]\n S1 --- L1\n S1 --- L2\n S1 --- L3\n S1 --- L4\n S2 --- L1\n S2 --- L2\n S2 --- L3\n S2 --- L4\n end"}'
The audit produces:
Other measured skills in the registry, with their headline benchmark lift.