mcpField
N
netbox-review-datamodel

netbox-review-datamodel

github.com/netboxlabsData & databases2148 installsUpdated 2w ago
Repository

About netbox-review-datamodel

netbox-review-datamodel is a review skill for auditing NetBox data model design and organization. It provides version-aware checks across hierarchy, IPAM, device modeling, extensibility, naming, and tenancy, with guidance to inspect a live instance when an MCP server is configured.

Key features

  1. 01Version-aware NetBox model checks
  2. 02Hierarchy and IPAM review
  3. 03Device and rack modeling checks
  4. 04Extensibility and naming guidance
  5. 05Tenancy and anti-pattern review

Use cases

  1. 01Audit an existing NetBox instance
  2. 02Review prefix, VRF, and VLAN organization
  3. 03Find modeling issues before changing schemas

MCP support

When a NetBox MCP server is configured, the skill can inspect the live model, count objects, and find inconsistencies.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/netboxlabs/skills --skill netbox-review-datamodel

After installing, type/netbox-review-datamodelin Claude Code to confirm it loaded.

Details

From the project README

NetBox Data Model Review

Your knowledge of NetBox data models may be outdated. Available model types, relationships, and extensibility mechanisms evolve between releases. Verify against current docs before recommending changes.

Retrieval Sources

SourceURL / MethodUse for
Data model docshttps://netboxlabs.com/docs/netbox/models/All available model types
Custom fields docshttps://netboxlabs.com/docs/netbox/customization/custom-fields/Field types and behavior
Custom Objects docshttps://netboxlabs.com/docs/extensions/custom-objects/No-code extensibility
NetBox MCP serverIf configured — inspect the current data model, count objects, find inconsistenciesLive model audit

Review Workflow

Follow this checklist when auditing a NetBox data model:

  1. Understand the organization — what kind of network? (enterprise, DC, ISP, hybrid)
  2. Check hierarchy — is the Region → Site Group → Site → Location → Rack hierarchy appropriate?
  3. Check IPAM — are prefixes properly nested? VRFs used where needed? Aggregates defined?
  4. Check naming — are slugs consistent? Are names human-readable and grep-friendly?
  5. Check extensibility choices — custom fields vs tags vs config contexts vs custom objects
  6. Check tenancy — is multi-tenancy used correctly? Over-tenanted or under-tenanted?
  7. Check for modeling smell — overloaded fields, misuse of description for structured data

Critical Rules

Hierarchy (HIER)
IDRuleSeverity
HIER-1Use Regions for geography, Site Groups for function — don't conflateHigh
HIER-2Locations are recursive — don't flatten (Floor > Room > Row is better than Row alone)Medium
HIER-3Every device should be in a Site (never orphaned at top level)High
HIER-4Racks should have a Location when the site has locations definedMedium
HIER-5Don't create single-child hierarchies — they add complexity without valueLow
HIER-6On 4.6+, RackGroups offer a flat, cross-location way to group racks (e.g. "cage-7", "cold-aisle-B") independent of the Location tree — use them when rack grouping doesn't map cleanly onto site/location nesting, not as a substitute for LocationsLow
HIER-7On 4.7+, hierarchies are ltree-backed: flag scripts/saved filters/exports that filter or order by level (no longer a DB column) — use parent_id/ancestor_id or get_ancestors() instead. Modeling advice is unchangedMedium
HIER-8On 4.7+, if the instance was restored from a 4.7.0 pg_dump, descendant paths may be stale after renames/moves — have the admin run manage.py rebuild_ltree_paths --check and repair before trusting hierarchy reportsMedium
IPAM (IPAM)
IDRuleSeverity
IPAM-1Define RIR Aggregates to track address space allocation boundariesMedium
IPAM-2Prefixes should nest correctly (child within parent CIDR)High
IPAM-3Use VRFs to separate overlapping address spaces — never duplicate prefixes in global tableCritical
IPAM-4IP Addresses must have prefix length (/32 for loopbacks, actual mask for interfaces)High
IPAM-5Use Roles to classify prefix purpose (infrastructure, customer, management); on NetBox 4.6+ ASNs can also carry a Role — use it to classify ASN purposeMedium
IPAM-6VLANs should be in VLAN Groups with an appropriate scope. Scope can be Region/SiteGroup/Site/Location/Rack/ClusterGroup/Cluster (and RackGroup on 4.6+) — don't assume site/location are the only options; pick the tightest scope that matches the VLANs' reuse boundaryMedium
IPAM-7On 4.7+, a service that listens on one port over several protocols (DNS tcp/53 + udp/53) is one Service with multiple port_mappings — flag duplicate per-protocol services (dns-tcp, dns-udp) and merge them; flag integrations still writing the deprecated protocol/ports pair (removed 5.0). On 4.5–4.6 one-service-per-protocol is the only optionLow
Device Modeling (DEV)
IDRuleSeverity
DEV-1Every device needs a Device Type (not just a name) — this enables port planningHigh
DEV-2Use Roles to classify function (router, switch, firewall) — not naming convention aloneHigh
DEV-3Platforms indicate software — assign them for config template compatibilityMedium
DEV-4Virtual chassis members should have proper VC position and master assignmentMedium
DEV-5Interface types must match reality (1000base-t vs 10gbase-sr) for capacity planningMedium
DEV-6Every Rack should have a Rack Type with dimensions defined there. On 4.7 the per-rack form_factor, width, and outer_* fields are deprecated; in 5.0 they are removed and rack_type becomes mandatory — flag racks whose rack_type is null (walk GET /api/dcim/racks/?brief=1 — there is no null filter on rack_type_id) and per-rack dimensions that differ from their typeHigh
DEV-7On 4.7+, model breakout/channelized ports with channels on the parent and channel_id subinterfaces (channel type), not as loose virtual interfaces or extra physical interfaces — otherwise cable paths and port counts are wrongMedium
DEV-8On 4.7+, use Module Bay Types where a chassis restricts which modules fit which slots (line-card vs supervisor vs fan bays) — an empty bay-type set means "anything fits", so absence is fine for simple hardware but flag chassis with mixed slot types and no bay typesLow
DEV-9On 4.7+, record hardware lifecycle with end_of_life on Device Types/Module Types and cooling with cooling_method (Device/DeviceType) and cooling_capability/cooling_capacity (Rack/RackType) — flag custom fields (cf_eol, cf_cooling) duplicating these. Liquid-cooled halls should use CoolingSource → CoolingFeed → intake/outflow components, mirroring PowerPanel → PowerFeedMedium
Extensibility (EXT)
IDRuleSeverity
EXT-1Use custom fields for single-valued structured data attached to one object type—
EXT-2Use tags for cross-object-type classification and boolean "has this property"—
EXT-3Use config contexts for hierarchical key-value data that merges by scope—
EXT-4Use custom objects when you need a new first-class entity with its own relationships—
EXT-5Never store structured data (JSON, lists) in description or comments fieldsHigh
EXT-6Don't create custom fields that duplicate built-in fields (e.g., custom "location" field; on 4.7+ also end_of_life, cooling_method, rack cooling capacity)High
EXT-7Prefer custom objects over dozens of custom fields when the data is really a related entityMedium
EXT-8On 4.6+, attach a validation_schema (JSON Schema) to JSON custom fields to enforce structure instead of leaving them free-form; flag JSON fields holding structured data with no schemaMedium
EXT-9On 4.7+, selection/multi-selection custom field values are returned as {value, label} objects — flag REST/GraphQL consumers (integrations, scripts calling the API) that compare custom_fields.x to a bare string (ORM access via obj.cf[...] still returns the raw value); and URL custom fields must use a scheme in ALLOWED_URL_SCHEMES — flag values with javascript:/custom schemes that will now fail validationMedium
Naming (NAME)
IDRuleSeverity
NAME-1Slugs should be lowercase, hyphenated, grep-friendly (nyc-dc1 not NYC_DC1)Medium
NAME-2Device names should encode location + function + index (sw-nyc-dc1-01)Low
NAME-3Be consistent — pick one naming scheme and apply it everywhereHigh
NAME-4Avoid embedding metadata in names (don't put VLAN ID in site name)Medium
Tenancy (TEN)
IDRuleSeverity
TEN-1Use tenants for logical ownership boundaries (customer, department, project)—
TEN-2Don't over-tenant — if everything belongs to one tenant, you probably don't need tenancyMedium
TEN-3Tenant Groups organize tenants hierarchically (e.g., by business unit)Low
TEN-4Shared infrastructure (management networks, core routers) can be untenantedMedium

Anti-Patterns to Flag

Anti-PatternWhy It MattersFix
Flat site hierarchy (no locations)Can't track floor/room/row placementAdd Location hierarchy
All IPs in global VRF with duplicatesIPAM conflicts, broken reportsSeparate into VRFs
Custom fields used as foreign keysNo referential integrity, hard to queryUse custom objects or tags
JSON blobs in description fieldsNot searchable, not validated, not filterableUse custom fields or config contexts
One giant "catch-all" custom field per typeDefeats the purpose of structured dataSplit into individual fields
Devices without Device TypesLoses port/bay/slot modelingAlways specify hardware model
Racks without Rack TypesPer-rack dimensions deprecated (4.7), removed and rack_type mandatory in 5.0Create one RackType per physical model, assign to racks, drop per-rack dims
One service per protocol for the same port (4.7+)Duplicates; protocol/ports deprecatedMerge into one Service with port_mappings
Breakout ports as extra physical interfaces (4.7+)Wrong cable paths and port countsParent channels + channel_id subinterfaces
Mixing naming conventionsImpossible to script against, confusingStandardize and bulk-rename
Tags with spaces or special charactersBreaks API filtering, scriptsUse slug-friendly tag names
Over-nested regions (> 3 levels)Adds complexity without improving navigationFlatten to 2-3 levels max
Prefix hierarchy gapsParent/child relationships brokenFill missing intermediate prefixes

Scope

This skill covers data model design and organization. It does NOT cover:

Principles

  • Context matters. A 5-site enterprise has different needs than a 500-site ISP. Don't over-engineer.
  • Audit the real instance. If MCP is available, query actual data rather than reviewing documentation alone.
  • Suggest, don't dictate. Many modeling choices are valid — flag clear anti-patterns, but acknowledge trade-offs for judgment calls.
  • Prioritize data integrity. Issues that cause broken relationships or duplicate data are more important than cosmetic naming issues.
  • Consider migration cost. Flagging an anti-pattern is more useful if you also explain how hard it is to fix with existing data.

Comments

Markdown supported