Repository navigation
v0.15.0
Added
- Multi-user NetBox API-token pass-through.
nbox serve --http --netbox-token-passthrough(or[serve].netbox_token_passthrough = true)
makes one nbox process serve many users: each caller presents their own NetBox
API token per request — inX-NetBox-Token, or inAuthorizationwhen that
header isn't already used by OIDC or--http-token— and nbox forwards it
verbatim to NetBox. NetBox's object permissions and changelog therefore apply
to the real caller, with no IdP and no[serve.vault]mapping. Reads are
cached per token so one user's view is never served to another,
nbox_cache_clearonly drops the caller's own partition, and--allow-writes
runs writes under the caller's token (behind OIDC the JWT still needs
nbox:write). A request without a caller token is rejected (401, or403
when OIDC/--http-tokenalready authenticated it), never silently downgraded
to the server's profile token.
Tokens are redacted everywhere; the audit log recordsauth=netbox-tokenplus
a short SHA-256netbox_token_fpand the per-caller rate-limit bucket keys on
it. Pass-through requires the HTTP transport (stdio has no per-request
headers, so asking for it there is a usage error) and allows binding a routable
address; terminate TLS in front of it. - Container image built from source. A
Dockerfile(multi-stage; the
existingDockerfile.releaseonly wraps prebuilt release binaries) and a
docker-compose.ymlfor running the multi-user pass-through server:
unprivileged uid 10001, read-only root filesystem, all capabilities dropped,
published on loopback for a TLS-terminating proxy to front, and no NetBox
credential baked into the image. ca_bundletrust anchors for NetBox behind an internal CA.
[profiles.<name>].ca_bundle = "/path/ca.pem"adds certificates to the
bundled Mozilla roots (which contain no private CAs), so an enterprise-issued
NetBox certificate verifies instead of failing withinvalid peer certificate: UnknownIssuer. Previously the only escape hatch wasverify_tls = false,
which disables verification altogether — it would expose the NetBox token to
anyone able to intercept the connection. An unreadable bundle, or one
containing no certificates, is a startup error rather than a silently
unverified connection.
Changed
- Upgrade the MCP SDK
rmcp1.8 → 3.3. No change to the tools, resources,
prompts, or negotiated protocol version (2025-11-25); the resource-template
and prompt-message types and theread_resource/get_prompthandler
returns moved to their rmcp 3 shapes. - Dependency refresh:
jsonwebtoken10 → 11,base640.22 → 0.23,dirs
6 → 7, and semver-compatible updates across the tree (tokio, clap, serde,
time, futures, …). No behavior change: the OIDC algorithm allowlist is
unchanged, anddirs7 only moves the Windows preference directory, which
nbox does not use (config paths are the same on every platform). - Bump
rmcp3.3 → 3.5 (ServerInfo→ServerConfigrename; the handshake
version stays pinned at2025-11-25, no behavior change) plus
semver-compatible refreshes (tokio, clap_complete, serde_json, thiserror,
tokio-util, jsonwebtoken, libc, tokio-test, insta). - Vault (
[serve.vault]) writes pick the auth scheme from each caller's token
(nbt_…→Bearer, otherwiseToken) instead of inheriting the profile's
auth_scheme, and share the profile client's GraphQL probe. - The README is now a short overview; install, usage, keybindings, and themes
moved todocs/INSTALL.mdanddocs/FEATURES.md, indexed bydocs/README.md.
Fixed
- Bump
h20.4.15 → 0.4.19 (RUSTSEC-2026-0258, unbounded empty DATA frames) and
rustls0.23.40 → 0.23.45 (RUSTSEC-2026-0285, TLS 1.3 handshake messages
accepted across encryption levels). - Bump
lru0.18.0 → 0.18.4 (RUSTSEC-2026-0253, unsoundLruCache::pop), and
move off yankedchacha200.10.0 andspin0.9.8. - Allow
clippy::unused_async_trait_impl(new in rustc 1.98) on the MCP
ServerHandlerimpl, whose methods are async by the rmcp trait contract. - Bump
rustls0.23.45 → 0.23.46 (RUSTSEC-2026-0346, -0347, -0348, -0349:
Debugimpls exposing session secrets, ECH-rejection data leak, brotli
certificate decompression allocation, ServerHello key-exchange downgrade). - Satisfy the
clippy::assert_is_emptylint (new in rustc 1.99) in tests:
assert!(x.is_empty())→assert_eq!; no behavior change.
What's Changed
- deps: upgrade rmcp 1.8 -> 3.3 by @lance0 in #145
- deps: bump jsonwebtoken 11, base64 0.23, dirs 7, refresh lockfile by @lance0 in #146
- fix: clear rustc 1.99 clippy gate and rustls advisories by @lance0 in #156
- Add ca_bundle profile option to trust a private CA by @eaxi in #149
- Add multi-user NetBox API-token pass-through to the MCP HTTP server by @eaxi in #151
- Add from-source Docker image and compose for the pass-through server by @eaxi in #152
- docs: slim README, move reference material under docs/ by @lance0 in #155
- deps: bump rmcp 3.3 -> 3.5 and refresh semver-compatible crates by @lance0 in #157
New Contributors
Full Changelog: v0.14.1...v0.15.0