v0.22.0
π Toolhive v0.22.0 is live!
This release lays the groundwork for the new thv vmcp command suite (serve / validate / init with optional TEI-backed semantic optimization β currently hidden while it stabilizes), expands identity coverage for Cedar authorization across Entra, Okta, Auth0, and Keycloak token shapes, and brings a wave of quality-of-life improvements to the skills, audit, secrets, and operator flows.
π New Features
- Upstream OAuth providers now accept
additionalAuthorizationParams, enabling Google'saccess_type=offlineand similar flows that require refresh tokens (#4862). - Cedar group extraction handles dual-claim (Entra
roles+groups) and dot-notation nested claims (realm_access.rolesfor Keycloak, URL-style claims for Auth0/Okta) (#4911). - Resource entities in Cedar now expose a
nameattribute, letting policies match on the real (unsanitized) resource URI (#4907). POST /api/v1beta/workloadsaccepts optionalregistryandserverfields, so clients can create a workload from a registry entry in a single call without fetching metadata first (#4872).- New
thv secret list --systemandthv secret delete --systemexpose and clean up the internal__thv_*tokens (registry OAuth, workload auth, enterprise login) (#4910). - Workloads stopped by a policy violation now surface a first-class
policy_stoppedstatus (π« inthv list/thv status), and restarts are gated by the active policy (#4857). thv skill install <skill>defaults to only installing into clients actually present on the system, with a clearer 400 error when no clients are detected (#4899).- Empty parent directories are cleaned up when the last skill for a client is uninstalled (#4895).
- Proxy audit middleware now distinguishes JSON-RPC application errors from HTTP-level success, logging them as
outcome=application_errorwithjsonrpc_error_code/messagemetadata (enabled by default; togglable viadetectApplicationErrors) (#4709). - Initial
thv vmcpcommand scaffolding landed (currently hidden from--help):servewith zero-config quick mode via--group,validate, andinitfor generating starter configs, plus optional Tier 1/Tier 2 semantic optimization backed by an on-demand HuggingFace TEI container (#4891, #4900, #4903, #4912, #4913, #4939, #4940).
π Bug Fixes
- vMCPs whose backends all require upstream OAuth no longer get stuck in
PhaseFailedβ unauthenticated backends are now treated as routable and report CRD statusunauthenticated(#4866). partialFailureMode: best_effortnow actually works β the validator was rejecting the CRD-defined enum value (#4865).- Misconfigured
OIDCConfigRef.Audiencevalues that didn't match the embedded auth server'sResourceURLnow fail fast with a clear reconciliation error instead of silently dropping every request at token validation (#4904). thv skill install io.github.stacklok/<skill>(and similar qualifiednamespace/namereferences) now fall back to the registry catalog when OCI pull fails, and first-time installs no longer fail to acquire the file lock when the skills directory doesn't yet exist (#4841).- Deployment drift checks now account for embedded-auth env vars, so operator-generated
MCPServer/MCPRemoteProxydeployments stop being incorrectly flagged as drifted (#4878). - Failed TEI container starts in
thv vmcp serveare now cleaned up instead of leaking a running container, andEmbeddingImageis defaulted consistently alongsideEmbeddingModel(#4948). - OCI skill pull failures now return
502 Bad Gateway(matching the git path) instead of400 Bad Request, and registry entries without an installable package return422 Unprocessable Entityinstead of404 Not Found(#4956, #4841).
π§Ή Misc
- Default builder images bumped to current stable releases:
golang:1.26-alpine,python:3.14-slim,node:24-alpine. Existing--runtime-imageor config overrides are unaffected (#4955, #4953, #4954). - Cedar entity factory refactored so dynamic
THVGroupentities no longer clobber static ones loaded fromentities_jsonβ parent relationships are now passed as variadicEntityUIDvalues (#4901). pkg/skills/skillsvcmonolithic file split into 13 per-concern files for production and matching test files β pure reorganisation, no API changes (#4947).thv vmcpcommand kept hidden from--helpand shell completion while it stabilizes (#4967).- Image verification mode now threaded through
WorkloadServicerather than hardcoded at two call sites (#4966). - Additional tests for Cedar group-based authorization,
pkg/vmcp/cli, and e2e coverage of the newthv vmcpcommand (#4898, #4941, #4964). - Copilot review follow-ups on the embedding manager, plus a finish-up on
defaultTEIImagerename (#4938, #4957). - Documentation updates: operator
authServerRefarchitecture, category-based Redis ACLs, README, and the new502 Bad GatewayOpenAPI annotation for skill install (#4780, #4915, #4946, #4960).
π¦ Dependencies
| Module | Version |
|---|---|
github.com/moby/spdystream |
v0.5.1 |
github.com/go-git/go-git/v5 |
v5.18.0 |
github.com/sigstore/timestamp-authority/v2 |
v2.0.6 |
github.com/stacklok/toolhive-catalog |
v0.20260421.0 |
alpine (Docker) |
v3.23.4 |
github/codeql-action |
digest 95e58e9 |
anthropics/claude-code-action |
digest 5d5c10a |
actions/cache |
digest 27d5ce7 |
π Welcome to our newest contributor: @SAY-5 π
Full commit log
What's Changed
- Remove empty parent directories on skill uninstall by @samuv in #4895
- Only install skills for clients detected on the system by @samuv in #4899
- Detect JSON-RPC application errors in proxy audit middleware by @gmogmzGithub in #4709
- Update operator architecture docs for authServerRef by @tgrunnagle in #4780
- Add AdditionalAuthorizationParams to upstream OAuth configs by @jhrozek in #4862
- Replace groups parameter with variadic parents on entity factory by @jhrozek in #4901
- Fix partialFailureMode validator to accept CRD enum values by @jhrozek in #4865
- Bump github.com/moby/spdystream from 0.5.0 to 0.5.1 by @dependabot[bot] in #4906
- Validate audience matches resourceUrl for embedded auth server by @tgrunnagle in #4904
- Extract vMCP serve/validate logic into pkg/vmcp/cli/ by @yrobla in #4891
- Add name attribute alias on Resource entities by @jhrozek in #4907
- Update module github.com/stacklok/toolhive-catalog to v0.20260417.0 by @renovate[bot] in #4909
- Add unit tests for pkg/vmcp/cli serve and validate logic by @yrobla in #4898
- Add pkg/vmcp/cli/init.go for vMCP config scaffolding by @yrobla in #4903
- Add thv vmcp serve and thv vmcp validate subcommands by @yrobla in #4900
- Update README by @danbarr in #4915
- Treat unauthenticated backends as routable in vMCP health by @lorr1 in #4866
- Bump github.com/go-git/go-git/v5 from 5.17.2 to 5.18.0 by @dependabot[bot] in #4921
- Add EmbeddingServiceManager for TEI container lifecycle by @yrobla in #4912
- Fix skill install for qualified namespace/name references and missing parent directory by @samuv in #4841
- Add zero-config quick mode for thv vmcp serve by @yrobla in #4913
- embedding_manager: address Copilot review findings from #4912 by @yrobla in #4938
- Add thv vmcp init subcommand by @yrobla in #4939
- Add --system flag to secret list and delete commands by @amirejaz in #4910
- Wire optimizer flags into thv vmcp serve by @yrobla in #4940
- Document category-based redis ACLs by @tgrunnagle in #4946
- Add policy_stopped workload status and enforce policy gate on restart by @reyortiz3 in #4857
- Extend group extraction with dual-claim and dot-notation support by @jhrozek in #4911
- vmcp: stop the TEI manager on Start failure and apply image default in Serve by @SAY-5 in #4948
- Update alpine Docker tag to v3.23.4 by @renovate[bot] in #4927
- Update github/codeql-action digest to 95e58e9 by @renovate[bot] in #4926
- Update anthropics/claude-code-action digest to 5d5c10a by @renovate[bot] in #4925
- Bump github.com/sigstore/timestamp-authority/v2 from 2.0.3 to 2.0.6 by @dependabot[bot] in #4793
- Account for embedded auth env in deployment drift checks by @JAORMX in #4878
- Update actions/cache digest to 27d5ce7 by @renovate[bot] in #4924
- Split skillsvc into per-concern files by @samuv in #4947
- Finish defaultTEIImage rename in embedding_manager_test.go by @JAORMX in #4957
- Upgrade default go builder image to golang:1.26-alpine by @JAORMX in #4955
- Return 502 Bad Gateway when OCI skill pull fails by @samuv in #4956
- Upgrade default uvx builder image to python:3.14-slim by @JAORMX in #4953
- Upgrade default npx builder image to node:24-alpine by @JAORMX in #4954
- Update module github.com/stacklok/toolhive-catalog to v0.20260421.0 by @renovate[bot] in #4932
- Document 502 Bad Gateway failure for installSkill in OpenAPI spec by @samuv in #4960
- Add registry-aware workload creation by @rdimitrov in #4872
- Add unit and integration tests for Cedar group-based authorization by @jhrozek in #4964
- Add e2e tests for thv vmcp CLI by @yrobla in #4941
- Thread image verification mode through workload service by @rdimitrov in #4966
- Hide thv vmcp command from CLI help by @JAORMX in #4967
- Release v0.22.0 by @stacklokbot in #4968
New Contributors
π Full changelog: v0.21.0...v0.22.0