Repository navigation
🚀 Toolhive v0.52.0 is live!
This release adds TLS for Redis session storage (runtime and operator), makes thv llm setup and teardown safer by default, and fixes several authorization, OAuth and operator issues.
⚠️ Breaking Changes
thv llm teardownnow purges cached tokens by default — a full teardown deletes cached OIDC tokens and fails if cleanup fails; pass--keep-tokensto keep the old behavior (migration guide) (#6733)DCRCredentialStoregained a method — out-of-tree implementations ofpkg/authserver/storage.DCRCredentialStoreno longer compile until they addUpdateDCRCredentialsIfUnchanged(migration guide) (#6758)
Migration guide: thv llm teardown purges cached tokens by default
Affects CLI users and scripts that run thv llm teardown. Cleanup is local only: tokens are deleted from the secrets provider, not revoked at the identity provider.
Before
# Tokens survived teardown unless you opted in
thv llm teardown
thv llm teardown --purge-tokensAfter
# Full teardown (no configured tools remain) purges cached tokens
thv llm teardown
# Keep tokens for a later setup
thv llm teardown --keep-tokens
# Targeted teardown still keeps tokens; --purge-tokens deletes them even when other tools remain
thv llm teardown <tool> --purge-tokensMigration steps
- If a script relied on tokens surviving a full teardown so a later
thv llm setupcould skip re-authentication, add--keep-tokens. - Teardown now exits non-zero if the secrets provider is unavailable or token listing or deletion fails (these were warnings before). Handle the failure, or pass
--keep-tokensto skip the purge. --keep-tokensand--purge-tokensare mutually exclusive.- Go callers:
llm.Teardownhas new parameters andllm.PurgeTokensnow returns an error.
Migration guide: DCRCredentialStore gained a method
Affects only Go code outside this repository that implements DCRCredentialStore (including hand-written mocks). The built-in memory and Redis stores are already updated.
Before
type DCRCredentialStore interface {
StoreDCRCredentialsIfAbsent(...)
UpdateDCRCredentialsIfPresent(...)
// ...
}After
type DCRCredentialStore interface {
// ...existing methods...
UpdateDCRCredentialsIfUnchanged(ctx context.Context, creds *DCRCredentials, expected *DCRCredentials) error
}Migration steps
- Add
UpdateDCRCredentialsIfUnchanged(ctx, creds, expected)to your implementation. - Overwrite the row at
creds.Keyonly if the stored row still equalsexpected. - Return a wrapped
ErrNotFoundif the row is absent and the newErrDCRCredentialsChangedif it differs; write nothing in either case. - Reject a nil
expected, or one whoseKeydiffers fromcreds.Key.
PR: #6758
🆕 New Features
- Redis session storage supports TLS in the proxy runner, vMCP and their rate limiters, with system roots or a private CA bundle (#6731)
MCPServer,MCPRemoteProxyandVirtualMCPServeracceptspec.sessionStorage.tls, includingcaCertSecretReffor a private CA; a startup WARN is now logged when Redis session storage runs without TLS, so log-based alerting may fire for existing plaintext setups (#6767)thv llm setupnow configures Claude Code for one-hour prompt caching by default; re-run setup to pick it up, or use--short-prompt-cacheto opt out (#6515)
🐛 Bug Fixes
spec.secretsonMCPServeraccepts multiple keys of the same Secret; re-apply theoperator-crdschart (#6690)- The token-exchange issuer policy no longer rejects an omitted
allowMayActwith a wildcard delegate; re-apply theoperator-crdschart (#6532) - Config resources are deleted promptly once their last referrer goes away instead of lingering up to 30 seconds (#6768)
- Cedar policies can use extension claims from RFC 7662 introspection (such as
roles); policies that referenced these claims will now see real values, so review any that were written around them being absent (#6707) - Authz-filtered
tools/list,prompts/listandresources/listresponses keep the members the backend sent (including MCP 2026-07-28resultType), always carryCache-Control: private, no-store, and reject ambiguous duplicate or aliased annotation members (#6709) - The embedded auth server no longer cuts off slow upstream identity-provider token endpoints at 10 seconds, which could leave a revoked refresh token stored (#6755)
🧹 Misc
- Add a shared JWT claim string-array decoder; Cedar behavior is unchanged (#6738)
- Clarify priority-conflict documentation and strengthen regression coverage (#6716)
- Clarify operator Helm values descriptions (#6771)
- Reduce Podman network normalization complexity (#6809)
- Drop the ping step from the remote MCP server e2e test (#6766)
- Use exact version comments on artifact actions (#6761)
- Add alex-feel to MAINTAINERS (#6808)
📦 Dependencies
| Module | Version |
|---|---|
charm.land/bubbletea/v2 |
v2.1.0 |
github.com/aws/aws-sdk-go-v2 |
v1.47.2 |
github.com/aws/aws-sdk-go-v2/config |
v1.33.8 |
github.com/aws/aws-sdk-go-v2/service/sts |
v1.51.3 |
github.com/cenkalti/backoff/v7 |
v7.0.1 |
github.com/getsentry/sentry-go (+ otel, otel/otlp) |
v0.50.0 |
github.com/go-git/go-git/v5 |
v5.19.3 |
github.com/go-git/go-billy/v5 |
v5.9.2 |
github.com/Microsoft/go-winio |
v0.6.3 |
github.com/moby/moby/client |
v0.6.2 |
github.com/moby/moby/api |
v1.56.1 |
github.com/prometheus/common |
v0.72.0 |
github.com/redis/go-redis/v9 |
v9.23.0 |
github.com/shirou/gopsutil/v4 |
v4.26.9 |
github.com/spiffe/go-spiffe/v2 |
v2.9.0 |
github.com/stacklok/toolhive-catalog |
v0.20261005.0 |
github.com/stacklok/toolhive-core |
v0.0.51 |
github.com/tidwall/gjson |
v1.20.0 |
go.opentelemetry.io/otel (and SDK/exporters) |
v1.47.0 |
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp |
v0.72.0 |
modernc.org/sqlite |
v1.60.1 |
sigs.k8s.io/controller-runtime |
v0.25.2 |
ghcr.io/modelcontextprotocol/inspector |
2.9.0 |
anchore/sbom-action |
v0.24.3 |
anthropics/claude-code-action |
v1.0.241 |
Full commit log
What's Changed
- Guard token exchange may_act CEL by @kocaemre in #6532
- Preserve custom claims from RFC 7662 introspection by @lorenzozanee in #6707
- Clarify priority conflicts and strengthen regression coverage by @JAORMX in #6716
- fix(operator): allow multiple keys of one Secret in spec.secrets by @lightsabit in #6690
- Purge LLM tokens on full teardown by @danbarr in #6733
- Update docker images by @renovate[bot] in #6750
- Update github actions by @renovate[bot] in #6747
- Default Claude Code prompt cache to one hour by @Sanskarzz in #6515
- Add compare-and-set update for DCR credentials by @tgrunnagle in #6758
- Use exact version comments on artifact actions by @jhrozek in #6761
- Update go modules by @renovate[bot] in #6749
- Update go modules by @renovate[bot] in #6764
- Add TLS to Redis session storage by @Sanskarzz in #6731
- Drop ping from remote MCP server e2e test by @jhrozek in #6766
- Remove the 10s header timeout from the upstream IdP client by @alex-feel in #6755
- Preserve list result members in authz filters by @alex-feel in #6709
- Clarify operator Helm values descriptions by @danbarr in #6771
- Add operator support for Redis session storage TLS by @peppescg in #6767
- Add shared JWT claim string-array decoder by @hellouz818 in #6738
- Add alex-feel to MAINTAINERS by @jhrozek in #6808
- Unblock config deletion when referrers go away by @jhrozek in #6768
- Reduce Podman network normalization complexity by @ChrisJBurns in #6809
- Release v0.52.0 by @toolhive-release-app[bot] in #6810
Full Changelog: v0.51.4...v0.52.0
🔗 Full changelog: v0.51.4...v0.52.0