Skip to content

v0.15.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 18:28
· 4 commits to master since this release

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 — in X-NetBox-Token, or in Authorization when 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_clear only 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, or 403
    when OIDC/--http-token already authenticated it), never silently downgraded
    to the server's profile token.
    Tokens are redacted everywhere; the audit log records auth=netbox-token plus
    a short SHA-256 netbox_token_fp and 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
    existing Dockerfile.release only wraps prebuilt release binaries) and a
    docker-compose.yml for 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_bundle trust 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 with invalid peer certificate: UnknownIssuer. Previously the only escape hatch was verify_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 rmcp 1.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 the read_resource / get_prompt handler
    returns moved to their rmcp 3 shapes.
  • Dependency refresh: jsonwebtoken 10 → 11, base64 0.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, and dirs 7 only moves the Windows preference directory, which
    nbox does not use (config paths are the same on every platform).
  • Bump rmcp 3.3 → 3.5 (ServerInfo → ServerConfig rename; the handshake
    version stays pinned at 2025-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, otherwise Token) 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 to docs/INSTALL.md and docs/FEATURES.md, indexed by docs/README.md.

Fixed

  • Bump h2 0.4.15 → 0.4.19 (RUSTSEC-2026-0258, unbounded empty DATA frames) and
    rustls 0.23.40 → 0.23.45 (RUSTSEC-2026-0285, TLS 1.3 handshake messages
    accepted across encryption levels).
  • Bump lru 0.18.0 → 0.18.4 (RUSTSEC-2026-0253, unsound LruCache::pop), and
    move off yanked chacha20 0.10.0 and spin 0.9.8.
  • Allow clippy::unused_async_trait_impl (new in rustc 1.98) on the MCP
    ServerHandler impl, whose methods are async by the rmcp trait contract.
  • Bump rustls 0.23.45 → 0.23.46 (RUSTSEC-2026-0346, -0347, -0348, -0349:
    Debug impls exposing session secrets, ECH-rejection data leak, brotli
    certificate decompression allocation, ServerHello key-exchange downgrade).
  • Satisfy the clippy::assert_is_empty lint (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

  • @eaxi made their first contribution in #149

Full Changelog: v0.14.1...v0.15.0