Fabric AIops
Disclaimer: Community-maintained open-source project, not affiliated with, endorsed by, or sponsored by Cisco, Meraki, Arista, Ubiquiti, or any network-controller vendor. Product and trademark names belong to their owners. Source at github.com/AIops-tools/Fabric-AIops under the MIT license.
Governed network-fabric controller operations — 37 MCP tools over five platforms (Cisco Meraki Dashboard: full read+write; Cisco Catalyst Center and Arista CloudVision Portal: read subsets; UniFi Network: read subset + device restart; Cisco ACI APIC: read-only endpoint path trace, EPG segment and faults), every one wrapped with the bundled @governed_tool harness: a local unified audit log under ~/.fabric-aiops/, token/runaway budget guard, undo-token recording, and descriptive risk tiers. The controller secret is stored encrypted (~/.fabric-aiops/secrets.enc, Fernet + scrypt) — never plaintext on disk.
Standalone: the governance harness is bundled in the package (
fabric_aiops.governance) — fabric-aiops has no external skill-family dependency. No platform has yet been exercised by this tool against a live controller; the ACI reads are tested against real, anonymized APIC responses from a production fabric (seedocs/VERIFICATION.md).
Platform support
| Platform | platform: |
Coverage | Auth |
|---|---|---|---|
| Cisco Meraki Dashboard | meraki |
full (all reads + all 8 writes) | API key (Bearer / X-Cisco-Meraki-API-Key) |
| Cisco Catalyst Center | catalyst |
read subset: sites (as orgs/networks), device+site+client health, issues→alerts, inventory, interface stats | username:password → short-lived X-Auth-Token (auto-refresh on 401) |
| Arista CloudVision Portal | cvp |
read subset: containers (as orgs/networks), inventory (+ complianceCode drift signal), events→alerts, users→admins | service-account token (Bearer) |
| Cisco ACI (APIC) | aci |
no canonical op — three ACI-native reads instead: endpoint path trace (MAC/IP → leaf/interface → EPG → BD → VRF → contracts → filter entries, plus DN-matched fault candidates), EPG segment, fabric faults | username:password → aaaLogin session cookie (refreshed; one re-login on 401/403) |
| UniFi Network | unifi |
read subset: sites (as orgs/networks), stat/device inventory+statuses, stat/health, alarms→alerts, stat/sta clients, device port_table→switch ports; plus the device-restart write (cmd/devmgr) | API key (X-API-KEY, stateless); base_url = classic https://<host>:8443 or UniFi OS console https://<console>/proxy/network |
Ops a platform does not map — and every write on catalyst/cvp (on unifi, every write except reboot) — return a teaching "not supported on <platform> yet — open an issue or PR" error, never a silent no-op. Full matrix in the repo README.
What This Skill Does
| Domain | Tools | Count | Read or Write |
|---|---|---|---|
| Overview | fabric fleet overview | 1 | 1 read |
| Organizations | list/get, licensing, admins, device statuses, API usage | 6 | 6 read |
| Networks | list/get, VLANs, health alerts, traffic | 5 | 5 read |
| Devices | inventory (by model), status, uplinks, switch ports, SSIDs | 5 | 5 read |
| Clients | list, detail, usage, connectivity | 4 | 4 read |
| Health (flagship) | uplink loss/latency RCA, network health score, config template drift | 3 | 3 read |
| Cisco ACI (APIC targets) | endpoint path trace, EPG segment, fabric faults | 3 | 3 read |
| Remediation | reboot, claim, remove, bind, unbind | 5 | 5 write (high) |
| update device, update VLAN | 2 | 2 write (medium) | |
| blink LEDs | 1 | 1 write (low) | |
| Undo | list recorded reversible writes | 1 | 1 read |
apply a recorded inverse (governed, single-use, dry_run) |
1 | 1 write (medium) |
network_health_score and config_template_drift are injected-only (they score data you already hold); uplink_loss_and_latency_rca accepts injected records for offline analysis, or pulls live from a configured target. Meraki device models carry a product-type prefix: MX appliance, MS switch, MR wireless AP, MV camera, MG cellular gateway.
Quick Install
uv tool install fabric-aiops
fabric-aiops init # interactive wizard: platform choice (meraki/catalyst/cvp/unifi) + encrypted secret
fabric-aiops doctor
Or as an OpenClaw plugin, which installs this skill and its MCP server together:
openclaw plugins install clawhub:@zw008/fabric-aiops
openclaw skills info fabric-aiops # expect: Visible to model: yes
Needs uvx on PATH: the MCP server is fetched with uv, pinned to this release.
When to Use This Skill
- Triage an organization (
overview): network count + device status/product rollup - Find the worst WAN uplinks (
health uplink-rca/uplink_loss_and_latency_rca): ranked by loss + latency with a likely cause and action - Score fleet health per network (
health score/network_health_score): a composite 0-100, worst first, every component shown - List/inspect organizations, networks, devices (by model), and clients
- Reboot/blink a device, update device or VLAN attributes (reversible), claim/remove devices, or bind/unbind a config template — all with dry-run + double-confirm
- On a Cisco ACI fabric: find where an endpoint (MAC/IP) attaches and which EPG / BD / VRF / contracts carry it (
aci trace/aci_endpoint_trace), inspect an EPG's segment (aci segment), or list faults worst-first (aci faults)
Do NOT use when the target is OT/industrial equipment (use industrial-aiops), a hypervisor, a storage appliance, a backup product, a container cluster, or device-level CLI/SSH network automation.
Related Skills — Skill Routing
| If the user wants… | Use |
|---|---|
| Cisco Meraki fabric: uplinks, health, config templates, device lifecycle | fabric-aiops (this skill) |
| Cisco Catalyst Center (DNA Center): site/device/client health, issues, inventory | fabric-aiops (this skill, platform: catalyst) |
| Arista CloudVision Portal: inventory, compliance drift signal, events | fabric-aiops (this skill, platform: cvp) |
| UniFi Network (self-hosted controller / UniFi OS console): site health, alarms, clients, device restart | fabric-aiops (this skill, platform: unifi) |
| Cisco ACI (APIC): endpoint location, EPG/BD/VRF/contract chain, fabric faults | fabric-aiops (this skill, platform: aci) |
| OT / industrial edge (Modbus, OPC-UA, PLC, PROFINET) | the industrial-aiops line |
| Hypervisor VM lifecycle (power, snapshot, migrate) | a hypervisor ops skill |
| Container/cluster lifecycle | a cluster ops skill |
Common Workflows
"The branch VPN keeps dropping" — diagnose degraded WAN uplinks
fabric-aiops health uplink-rca→ worst MX WAN uplinks ranked by avg loss + latency, each citing the measured numbers plus a likely cause and actionfabric-aiops health uplink-rca --loss-pct 2 --latency-ms 100→ tighten the thresholds if nothing crosses the defaults but users still complainfabric-aiops device uplinks→ the raw per-appliance uplink statuses across the org (WAN1/WAN2, active vs failover) behind the ranking — confirm the flagged appliance rather than trusting the summaryfabric-aiops network alerts <networkId>→ check whether the controller already raised a matching alert (independent corroboration before you touch anything)- Failure branch: if the RCA returns no uplink records at all, the org has no appliances reporting uplink telemetry, or the API key lacks org-wide read — run
fabric-aiops doctorand re-check the org id withfabric-aiops org listrather than assuming the WAN is healthy.
Rank the fleet and fix the worst network's device attributes (reversible)
fabric-aiops overview→ org-level rollup: network count and device status/product mixfabric-aiops health score→ composite 0-100 per network, worst first, with every scoring component shownfabric-aiops org device-statuses→ find the offline/alerting devices dragging the worst network's scorefabric-aiops device status <serial>→ confirm the device before changing itfabric-aiops remediate update-device <serial> '{"name":"branch-ap-01"}' --dry-run→ preview the exactPUT /devices/<serial>call; then run without--dry-run(double confirmation). The real before-state is fetched first and recorded as a faithful inverse- Failure branch: wrong attribute or wrong device —
fabric-aiops undo list, thenfabric-aiops undo apply <id>restores the captured prior attributes. Re-runfabric-aiops device status <serial>to confirm the restore landed rather than trusting the undo's success message.
Bring a drifted network back to its config template (reversible)
fabric-aiops network list→ the networks in scope and their ids- Pass the template plus its bound networks to
config_template_drift(template=..., networks=[...])→ the settings that deviate, per network fabric-aiops network vlans <networkId>→ confirm the drifted VLAN's current values before changing anything- Fix the specific setting —
fabric-aiops remediate update-vlan <networkId> <vlanId> '{"name":"data"}' --dry-run, then for real — or re-establish the binding itself:fabric-aiops remediate bind <networkId> <templateId> --dry-run, then without--dry-run(double confirmation). Both capture the real before-state and record an inverse descriptor (forbind, the inverse is unbind or a rebind to the prior template) - Failure branch: if the rebind makes things worse,
fabric-aiops undo apply <id>returns the network to its captured prior binding;fabric-aiops remediate unbind <networkId>is the manual escape hatch. Re-runconfig_template_driftto confirm the drift actually cleared instead of trusting the write's success message.
Stage a replacement device into a branch network
fabric-aiops device inventory→ confirm the replacement serial is in the org inventory and unassignedfabric-aiops network get <networkId>→ confirm the target networkfabric-aiops remediate claim <networkId> <serial> --dry-run→ previewPOST /networks/<networkId>/devices/claim; then run for real (double confirmation) — the inverse (remove from network) is recordedfabric-aiops remediate blink-leds <serial> --duration 30→ low-risk physical confirmation that you are at the right box in the rackfabric-aiops health score→ confirm the network's score recovers once the device reports in- Failure branch: wrong network —
fabric-aiops undo apply <id>orfabric-aiops remediate remove <networkId> <serial>. Notefabric-aiops remediate reboot <serial>isno undoby construction (a reboot has no safe inverse); it records only the before-state, so use it last, not as a first response.
"This VM can't reach its database" — reconstruct the ACI path (read-only)
fabric-aiops aci trace --ip <vm-ip>→ the endpoint's attachment (pod / leaf / interface or vPC), its EPG → bridge domain → VRF, the contracts the EPG provides/consumes down to filter entries, and faults whose DN names the EPG or the interface- Read
findingsfirst (worst-first, each with its signal): an unformed attachment or an unresolved BD/VRF/contract relation is where the configured chain breaks fabric-aiops aci trace --ip <db-ip>→ the peer's chain; compare VRFs and whether one EPG provides a contract the other consumesfabric-aiops aci faults→ fabric-wide faults worst-first, when the chain itself is clean- Failure branch:
notFoundmeans the fabric has not learned the address now (silent hosts age out) — not that the host is down. A section that isnullwith an entry inerrorswas not read; do not report it as absent.staticPathResolved: trueis configuration, not proof traffic flows — this is not a reachability test, and vzAny / taboo / preferred-group rules are listed innotChecked, not evaluated.
Offline analysis (no live controller)
- Export the org's uplink, device-status, and template data to JSON
- Feed it straight to the analysis tools —
uplink_loss_and_latency_rca(records=[...]),network_health_score(device_statuses=[...]),config_template_drift(template=..., networks=[...])— no connection or credentials required - Failure branch: a tool that rejects the injected records means the export is missing fields the analysis needs (loss/latency samples, device status, template settings) — re-export rather than hand-editing, so the findings stay traceable to the controller.
Governance & Safety
The skill delivers reads and writes and records them; it does not decide whether a write is permitted. That is your agent's judgement, or the permission of the account you connect it with (a Meraki API key whose admin has read-only organization access — writes then fail at the controller). There is no read-only switch, policy file, or approval gate.
- Audit is the guarantee, and it is not bypassable. Every operation — MCP and CLI alike — is logged to
~/.fabric-aiops/audit.db(relocatable viaFABRIC_AIOPS_HOME): params, result, status, duration, and the risk tier. The CLI writes the same row the MCP path does. FABRIC_AUDIT_APPROVED_BY/FABRIC_AUDIT_RATIONALEare optional annotations recorded on the audit row (who/why); they are never required and never block.- Runaway guard — a safety backstop, not authorization: the same call looped in a tight window trips a circuit breaker. Disable with
FABRIC_RUNAWAY_MAX=0. - Destructive writes support
--dry-run/dry_run=Trueand double confirmation at the CLI. - Mutating/reversible writes fetch the real before-state and record an inverse descriptor (
update_device/update_network_vlan→restore prior values,claim↔remove,bind↔unbind/rebind); irreversible ops (reboot_device,blink_device_leds) record only the before-state.
References
references/capabilities.md— full tool + field referencereferences/cli-reference.md— CLI command referencereferences/setup-guide.md— onboarding, credentials, and connectivity
