Dynamic NetBox CLI generated from the live OpenAPI schema.
Project description
netbox-super-cli (nsc)
A Python CLI for NetBox that builds its command tree dynamically from your install's live OpenAPI schema. The same binary works against any NetBox version and exposes plugin-provided endpoints automatically — the schema, not hand-written code, defines the surface.
Docs: thomaschristory.github.io/netbox-super-cli — the full guide, including install, first-run, guides, and the auto-generated CLI/config/exit-code reference.
Why
- Plugins just work. If your install has plugins, their endpoints appear as commands automatically.
- Multi-instance. Named profiles per NetBox instance, plus env-var overrides.
- Safe by default. POST/PATCH/PUT/DELETE preview as dry-runs unless you pass
--apply. - Agent-friendly. Deterministic command shape, machine-readable JSON output, stable error envelope with documented exit codes.
Install
uv tool install netbox-super-cli
# or, with pipx:
pipx install netbox-super-cli
Or from source:
git clone https://github.com/thomaschristory/netbox-super-cli
cd netbox-super-cli
uv sync
uv run nsc --version
Reading
export NSC_URL=https://netbox.example.com
export NSC_TOKEN=$(cat ~/.netbox-token)
uv run nsc dcim devices list
uv run nsc dcim devices list --site-id 42 --status active --all --output json
uv run nsc dcim devices get 7
uv run nsc circuits providers list --output csv
uv run nsc ipam prefixes list --filter created__gte=2026-01-01 --output yaml
Writing
# Dry-run by default — shows the resolved request without sending it.
uv run nsc dcim devices create -f device.yaml --explain
# Commit with --apply.
uv run nsc dcim devices create -f device.yaml --apply
# Bulk create: one HTTP call when the schema supports it, sequential loop otherwise.
uv run nsc dcim devices create -f devices.yaml --apply
uv run nsc dcim devices create -f devices.yaml --no-bulk --on-error continue --apply
# NDJSON / JSONL — one record per line; parse failures abort the whole batch
# before any wire request fires (`type: input_error`, exit 4, `details.bad_lines`).
uv run nsc dcim devices create -f devices.ndjson --apply
cat devices.ndjson | uv run nsc dcim devices create -f - --apply
# Per-field overrides (CLI wins over file on overlap).
uv run nsc dcim devices update 42 --field status=active --apply
# Delete; default is exit-0 if already gone, --strict turns missing-id into exit 9.
uv run nsc dcim devices delete 42 --apply
uv run nsc dcim devices delete 42 --apply --strict
Every write attempt — dry-run included — appends one line to ~/.nsc/logs/audit.jsonl; the most recent exchange is also mirrored to ~/.nsc/logs/last-request.json.
Bulk input formats
| Form | File extension or stdin shape | Routing |
|---|---|---|
| YAML mapping | .yaml / .yml |
Single record. |
| YAML list | .yaml / .yml |
Bulk: one record per list item. |
| JSON object | .json or {...}EOF on stdin |
Single record. |
| JSON array | .json or [...] on stdin |
Bulk: one record per array item. |
| NDJSON | .ndjson / .jsonl or {...}\n{...} on stdin |
Bulk: one record per line. |
Stdin is sniffed from the first 512 bytes (first non-whitespace byte plus a one-object lookahead for newline-then-{). NDJSON parse failures collect up to 20 bad_lines and abort before any wire request; --no-bulk still forces a loop fallback for any bulk shape.
Audit log sensitivity
audit.jsonl is confidential (not secret). It records what was sent — record-level data your account had write access to. The CLI redacts:
- HTTP headers in the
SENSITIVE_HEADERSset (e.g.Authorization,X-API-Key) — replaced with"<redacted>". - Request-body fields whose OpenAPI definition has
format: passwordOR whose name (case-insensitive) is one of:password,secret,token,api_key,apikey,private_key,passphrase,client_secret. Nested fields and arrays of objects are walked recursively.
The wire body sent to NetBox is not redacted — only the audit log. A failed write still records the redacted body; redaction is irreversible. Treat audit.jsonl like a verbose application log: gate it behind your home-directory permissions and rotate / archive accordingly. A "redact everything" mode is on the post-v1.0 roadmap.
Output and errors
--output {table,json,yaml,csv,jsonl}. Table is the default on a TTY; JSON is the default when stdout is piped.- On
--output json, the records array is emitted directly (no NetBox-stylecount/resultswrapper); single-record writes emit the resulting record dict. - Failures emit a stable
ErrorEnvelope(JSON to stdout on--output json, Rich panel to stderr otherwise) withtype ∈ {auth, not_found, validation, conflict, rate_limited, server, transport, schema, config, client, internal, ambiguous_alias, unknown_alias, input_error}and a documented exit code per type. SeeCHANGELOG.mdand the spec for the full table.
Schema introspection
# Dump every endpoint in the bundled NetBox schema as JSON.
uv run nsc commands --schema nsc/schemas/bundled/netbox-4.6.0.json.gz --output json | head
# Or against a live install.
uv run nsc commands --schema https://netbox.example.com/api/schema/?format=json --output json
Cache management
The on-disk command-model cache lives at ~/.nsc/cache/<profile>/<schema-hash>.json and is regenerated automatically when the live NetBox schema changes. Over time, removed profiles or upgraded NetBox versions can leave orphan entries behind.
nsc cache prune # show what would be deleted (dry-run)
nsc cache prune --apply # actually delete
nsc cache prune --max-age 30 --apply # also delete cache files older than 30 days
nsc cache prune --output json # structured envelope for scripts
What gets pruned:
- Cache directories for profiles that are no longer in your config.
- Cache files whose schema-hash differs from the live NetBox schema (skipped per-profile when offline).
- With
--max-age <days>: cache files older than the threshold (excludes files already covered by rule 1).
The adhoc cache directory (used by env-var-only invocations like NSC_URL=… nsc dcim devices list) is never pruned automatically.
Shell completion
nsc ships static completion stubs that complete subcommands and option names.
nsc --install-completion # auto-detects $SHELL
nsc --show-completion # prints the script instead of installing
Typer supports bash, zsh, fish, and pwsh. Completion of dynamic values (resource names, profile names, filter keys) is on the post-1.0 roadmap.
Bundled Skill for AI agents
nsc ships a portable Skill bundle at skills/netbox-super-cli/SKILL.md
that briefs an AI agent on how to drive nsc correctly (dry-run discipline,
JSON output, error envelope, audit log).
nsc skill install --target claude-code # dry-run; prints the destination
nsc skill install --target claude-code --apply # actually copies
# Or export to an arbitrary directory (e.g. CI or a shared-skill repo).
nsc skill export ./skills # dry-run; prints the would-write path
nsc skill export ./skills --apply # writes ./skills/netbox-super-cli/SKILL.md
skill install targets: claude-code, codex, gemini, copilot. Where a
target has no documented programmatic install path, the helper prints actionable
manual instructions instead of guessing. skill export <dir> always writes to
<dir>/netbox-super-cli/SKILL.md and, like install, is dry-run unless you
pass --apply.
License
Apache 2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netbox_super_cli-1.0.8.tar.gz.
File metadata
- Download URL: netbox_super_cli-1.0.8.tar.gz
- Upload date:
- Size: 952.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dfe317118bbcd54e2ab823db6dd5f805788056370ba226ac9e6e43592bdd7639
|
|
| MD5 |
189c6247ceb7f122696437b87439a5af
|
|
| BLAKE2b-256 |
2bd5ff895f60ea219af71f942f0d402e3c807b2865a9af52b28945b5f2637816
|
Provenance
The following attestation bundles were made for netbox_super_cli-1.0.8.tar.gz:
Publisher:
release.yml on thomaschristory/netbox-super-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netbox_super_cli-1.0.8.tar.gz -
Subject digest:
dfe317118bbcd54e2ab823db6dd5f805788056370ba226ac9e6e43592bdd7639 - Sigstore transparency entry: 1778257636
- Sigstore integration time:
-
Permalink:
thomaschristory/netbox-super-cli@f348657acb6eb85a2a2ee16536d52da51ae6004f -
Branch / Tag:
refs/tags/v1.0.8 - Owner: https://github.com/thomaschristory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f348657acb6eb85a2a2ee16536d52da51ae6004f -
Trigger Event:
push
-
Statement type:
File details
Details for the file netbox_super_cli-1.0.8-py3-none-any.whl.
File metadata
- Download URL: netbox_super_cli-1.0.8-py3-none-any.whl
- Upload date:
- Size: 780.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ddbe3e6f8f3ea6087d9ddea774bf7a8c437adc9af2b60566a0aa362989dd0fb
|
|
| MD5 |
03c1f25d70330ff9f4e6a2bfc75e0a9d
|
|
| BLAKE2b-256 |
7795db81f1e3c189faf68ecbc4d9132c8ba4d6b53ab04c74a81328683e2f7f41
|
Provenance
The following attestation bundles were made for netbox_super_cli-1.0.8-py3-none-any.whl:
Publisher:
release.yml on thomaschristory/netbox-super-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netbox_super_cli-1.0.8-py3-none-any.whl -
Subject digest:
5ddbe3e6f8f3ea6087d9ddea774bf7a8c437adc9af2b60566a0aa362989dd0fb - Sigstore transparency entry: 1778258537
- Sigstore integration time:
-
Permalink:
thomaschristory/netbox-super-cli@f348657acb6eb85a2a2ee16536d52da51ae6004f -
Branch / Tag:
refs/tags/v1.0.8 - Owner: https://github.com/thomaschristory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f348657acb6eb85a2a2ee16536d52da51ae6004f -
Trigger Event:
push
-
Statement type: